我有这样的文件清单。
[
{
"name" : "test",
"data" : [
{ "code" : "name", "value" : "Diego" },
{ "code" : "nick", "value" : "Darko" },
{ "code" : "special", "value" : true }
]
},
{
"name" : "another",
"data" : [
{ "code" : "name", "value" : "Antonio" },
{ "code" : "nick", "value" : "Tony" }
]
}
]
现在我需要找到所有文件:
a)不包含"数据"带代码"特殊"
的项目OR
b)包含"数据"带代码的项目"特殊"并且值为false
我需要与 $ elemMatch 相反或者我错过了什么?
答案 0 :(得分:4)
我假设您将每个文档作为集合test
的单独成员插入到文档列表中。
对于a,
db.test.find({ "data.code" : { "$ne" : "special" } })
对于b。,
db.test.find({ "data" : { "$elemMatch" : { "code" : "special", "value" : false } } })
将两者与$or
,
db.test.find({ "$or" : [
{ "data.code" : { "$ne" : "special" } },
{ "data" : { "$elemMatch" : { "code" : "special", "value" : false } } }
] })
答案 1 :(得分:0)
希望 $ ni n能解决您的问题。 我将您的文档插入“so”集合
db.so.find({})相当();
{
"_id" : ObjectId("5489cd4f4cb16307b808d4b2"),
"name" : "test",
"data" : [
{ "code" : "name",
"value" : "Diego"
},
{ "code" : "nick",
"value" : "Darko"
},
{ "code" : "special",
"value" : true
}
]
}
{
"_id" : ObjectId("5489cd674cb16307b808d4b3"),
"name" : "another",
"data" : [
{"code" : "name",
"value" : "Antonio"
},
{ "code" : "nick",
"value" : "Tony"
}
]
}
不包含代码为“special”的“数据”项
> db.so.find({"data.code":{$nin:["special"]}}).pretty();
{
"_id" : ObjectId("5489cd674cb16307b808d4b3"),
"name" : "another",
"data" : [
{ "code" : "name",
"value" : "Antonio"
},
{ "code" : "nick",
"value" : "Tony"
}
]
}
包含代码为“special”且值为false
的“数据”项db.so.find({$和:[{ “data.code”: “特殊”},{ “data.value”:假}]})。漂亮();