说我在myCollection中有以下文件:
/* 1 */
{
"_id" : ObjectId("57861717ae5cdd68414b22fc"),
"category" : " ",
"name" : "Category is a space"
}
/* 2 */
{
"_id" : ObjectId("57861728ae5cdd68414b22fd"),
"category" : null,
"name" : "Category is null"
}
/* 3 */
{
"_id" : ObjectId("5786173dae5cdd68414b22fe"),
"name" : "Category is a not present"
}
/* 4 */
{
"_id" : ObjectId("57861755ae5cdd68414b22ff"),
"category" : "value",
"name" : "Category has value"
}
我想查询具有类别字段的文档,该值不为空或不为空。
我尝试了以下查询:
使用$exists
和两个$ne
db.myCollection.find({"category":{"$exists":true}, "category":{"$ne":null}, "category":{"$ne":" "}})
我收到了3份文件。
/* 1 */
{
"_id" : ObjectId("57861728ae5cdd68414b22fd"),
"category" : null,
"name" : "Category is null"
}
/* 2 */
{
"_id" : ObjectId("5786173dae5cdd68414b22fe"),
"name" : "Category is a not present"
}
/* 3 */
{
"_id" : ObjectId("57861755ae5cdd68414b22ff"),
"category" : "value",
"name" : "Category has value"
}
使用$exists
和$ne=null
db.myCollection.find({"category":{"$exists":true}, "category":{"$ne":null}})
我收到了2份文件。
/* 1 */
{
"_id" : ObjectId("57861717ae5cdd68414b22fc"),
"category" : " ",
"name" : "Category is a space"
}
/* 2 */
{
"_id" : ObjectId("57861755ae5cdd68414b22ff"),
"category" : "value",
"name" : "Category has value"
}
最后,我尝试了$exists
和$ne
中包含的两个$and
db.myCollection.find({"category":{"$exists":true}, "$and":[{"category":{"$ne":null}}, {"category":{"$ne":" "}}]})
只有这样才能得到所需的输出:
/* 1 */
{
"_id" : ObjectId("57861755ae5cdd68414b22ff"),
"category" : "value",
"name" : "Category has value"
}
现在我得到了我想要的结果,我想了解其他两个查询的错误,尤其是第一个查询。
答案 0 :(得分:4)
来自docs
MongoDB在指定逗号时提供隐式AND操作 分隔的表达式列表。使用明确的AND与 $和 当相同的字段或运算符必须是时,运算符是必需的 在多个表达式中指定。
因此,您的第一个查询多次使用相同的字段,第二个查询不会过滤掉空白值。