我不了解命令$ exists的行为。
我在集合中有两个简单的文档' user':
/* 1 */
{
"_id" : ObjectId("59788c2f6be212c210c73233"),
"user" : "google"
}
/* 2 */
{
"_id" : ObjectId("597899a80915995e50528a99"),
"user" : "werty",
"extra" : "very important"
}
我想检索包含字段" extra"并且该值不等于“不重要”':
查询:
db.getCollection('users').find(
{"extra":{$exists:true},"extra": {$ne:"unimportant"}}
)
返回两个文件。
还有查询
db.getCollection('users').find(
{"extra":{$exists:false},"extra": {$ne:"unimportant"}}
)
返回两个文件。
似乎$存在(当与同一领域的其他条件一起使用时)就像' OR'一样。 我做错了什么?任何帮助表示赞赏。
我使用了mongodb 3.2.6和3.4.9
我看过Mongo $exists query does not return correct documents 但我没有稀疏的索引。
答案 0 :(得分:3)
根据MongoDB文档(https://docs.mongodb.com/manual/reference/operator/query/and/):
当必须在多个表达式中指定相同的字段或运算符时,必须使用带有$和运算符的显式AND。
因此,为了强制执行这两个条款,您应该使用$and
运算符,如下所示:
db.getCollection('users').find({ $and : [ { "extra": { $exists : true } }, { "extra" : { $ne : "unimportant" } } ] });
答案 1 :(得分:0)
构建查询的方式是错误的,与$exists
的工作方式无关。因为您正在检查两个条件,所以您需要一个执行逻辑AND操作的查询来满足这两个条件。
查询的正确语法
我想检索包含字段" extra"和 价值不等于“不重要”
应该遵循:
db.getCollection('users').find(
{
"extra": {
"$exists": true,
"$ne": "unimportant"
}
}
)
或使用 $and
运算符:
db.getCollection('users').find(
{
"$and": [
{ "extra": { "$exists": true } },
{ "extra": { "$ne": "unimportant" } }
]
}
)