我有一个文档:
"_id": ObjectId("THE DOCUMENT ID"),
"GROUP NAME": "First Floor",
"years": {
"0": {
"_id": "YEAR ID",
"year_classes": {
"0": {
"class_name": "CLASS A",
"_id": "CLASS ID",
"participants": {
"0": "PARTICIPANT ID"
}
},
"1": {
"class_name": "CLASS B",
"_id": "CLASS ID",
"participants": {
"0": "PARTICIPANT ID"
}
},
},
"year_name": "YEAR 1"
},
"1": {
"_id": "YEAR ID",
"year_classes": {
"0": {
"_id": "CLASS ID",
"class_name": "CLASS C",
"participants": [
]
}
},
"year_name": "YEAR 2"
},
}
需要在一年中再增加一个班。代码通过$year_id变量(是一个字符串)具有年份id,类将添加到该变量中。
因此,它必须检查$NEW_class_name(字符串变量)给出的类名是否在当年已经使用过。
我看到了mongo的$and运算符,但我没能让它工作。如果它是一个SQL,它看起来像:WHERE year_id
='$YEAR_ID'AND class_name
='$NEW_CLASS_NAME'
如何在MongoDB中做到这一点?
更新:
查询:
{"years.year_classes.class_name":$NEW_class_name,"years_id":$YEAR_id}
正在搜索文档(因此它将始终返回TRUE)不是同一个数组。
有没有一种方法可以引导查询在同一个数组中找到这两个值,那么一个具有该名称的类,它在具有该特定ID的年份数组中的类数组中?
当比较嵌入对象内的两个条件时,需要使用$elemMatch。请参阅此处的一般说明。
您的查询结构类似于:
db.coll.find({"years":{$elemMatch:{"year_classes.class_name":$NEW_CLASS_NAME,"_id":$YEAR_ID }}})