Mongodb:$存在且$ ne不能一起工作

时间:2016-07-13 10:37:09

标签: mongodb mongodb-query

说我在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"
}

我想查询具有类别字段的文档,该值不为空或不为空。

我尝试了以下查询:

  1. 使用$exists和两个$ne

    db.myCollection.find({"category":{"$exists":true}, "category":{"$ne":null}, "category":{"$ne":" "}})
    
  2. 我收到了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"
    }
    
    1. 使用$exists$ne=null

      db.myCollection.find({"category":{"$exists":true}, "category":{"$ne":null}})
      
    2. 我收到了2份文件。

      /* 1 */
      {
          "_id" : ObjectId("57861717ae5cdd68414b22fc"),
          "category" : " ",
          "name" : "Category is a space"
      }
      
      /* 2 */
      {
          "_id" : ObjectId("57861755ae5cdd68414b22ff"),
          "category" : "value",
          "name" : "Category has value"
      }
      
      1. 最后,我尝试了$exists$ne中包含的两个$and

        db.myCollection.find({"category":{"$exists":true}, "$and":[{"category":{"$ne":null}}, {"category":{"$ne":" "}}]})
        
      2. 只有这样才能得到所需的输出:

        /* 1 */
        {
            "_id" : ObjectId("57861755ae5cdd68414b22ff"),
            "category" : "value",
            "name" : "Category has value"
        }
        

        现在我得到了我想要的结果,我想了解其他两个查询的错误,尤其是第一个查询。

1 个答案:

答案 0 :(得分:4)

来自docs

  

MongoDB在指定逗号时提供隐式AND操作   分隔的表达式列表。使用明确的AND与 $和   当相同的字段或运算符必须是时,运算符是必需的   在多个表达式中指定

因此,您的第一个查询多次使用相同的字段,第二个查询不会过滤掉空白值。