【问题标题】:MongoDb query array with null values具有空值的 MongoDb 查询数组
【发布时间】:2013-02-26 10:18:33
【问题描述】:

我的收藏中有一些看起来像这样的对象:

{ MyArray:[null, "some value", null] }

我想查询那些具有空值作为数组元素的对象。查询

db.collection.find({"MyArray":null})

不起作用,它似乎只找到 MyArray 为空的对象,例如

{ MyArray:null }

我需要如何定义我的查询?

编辑:请看我的一个真实对象:

{
        "_id" : BinData(3,"ch9PrWveqU6niB6FGVhIOg=="),
        "PeerGroup" : "male",
        "ProductId" : BinData(3,"weRiKOtXEUSDZHkGHLcwzw=="),
        "CategoryIds" : [
                BinData(3,"BXzpwVQozECLaPkJy26t6Q=="),
                BinData(3,"ox303ZeM50KelvoUbPBJ8Q=="),
                BinData(3,"26ziaY+G9UKMyjmtVkkhcg=="),
                BinData(3,"D2X8vObte0eJHNcDfp2HBw==")
        ],
        "ShopId" : BinData(3,"ZdfPmrlKR0GkLPC4djJuKw=="),
        "BrandId" : BinData(3,"kCHyuyLvgECxPF1nxwr7qQ=="),
        "Created" : ISODate("2012-08-24T07:42:12.416Z"),
        "LastActivity" : ISODate("2013-01-14T19:38:11.776Z"),
        "Price" : 129.9,
        "Sale" : false,
        "Rating" : 11.057340703605368,
        "RatingTimed" : 0.05670431130054035,
        "Available" : null,
        "FreeDelivery" : null,
        "Attrs" : [
                null,
                null,
                null,
                null
        ]
}

然后我查询:

db.collection.find({"Attrs":null})

没有结果。

【问题讨论】:

  • > db.collection.find({"MyArray":null}) 给出{ "_id" : ObjectId("513da72088ba1cdba2745f1e"), "MyArray" : [ null, "some value", null ] }。果然……?
  • 查询应该可以工作。请向您展示真实数据和查询。
  • 为我的问题添加了真实数据和查询。
  • 我无法重现您的数据和查询问题 - 它可以正常工作 (MongoDB 2.4.1)。你的 MongoDB 版本是多少?
  • 如果您能标记我的答案,那就太好了。不想对它粗鲁,但我经常自己回来作为参考:)

标签: mongodb


【解决方案1】:

要查找包含数组的文档,请运行具有空元素的文档:

db.collection.find({"keyWithArray":{$elemMatch:{"$in":[null], "$exists":true}}})

根据safaribooksonline 正确的null 匹配是使用$in 执行的(因为您不能将$eqnull 一起使用)。 另外,和null比较:

{"something":null}

将匹配“something”字段设置为 null 的文档以及根本没有“something”字段的每个文档。因此,我们必须使用$exists 确保密钥存在。

【讨论】:

    【解决方案2】:

    好的,我通过我的 C# 驱动程序加载我的“空”候选者来解决这个问题,结果发现这些值不是空的,而是 Bson 未定义!它们在 shell 中显示为“null”!见http://jira.mongodb.org/browse/SERVER-2426。 这有效:

    db.xxx.find({"Attrs":{$type:6}})

    【讨论】:

      【解决方案3】:

      (不是真正的答案,但不适合评论)

      我无法重现该问题,我将您的数据复制到 mongo shell 并在 MongoDB 版本 2.2.3、2.4.1 和 2.4.0 中进行了尝试:

      MongoDB 外壳版本:2.4.0 连接到:测试

      > db.version()
      2.4.0
      > db.xxx.insert({
      ... "_id" : BinData(3,"ch9PrWveqU6niB6FGVhIOg=="),
      ... "PeerGroup" : "male",
      ... "ProductId" : BinData(3,"weRiKOtXEUSDZHkGHLcwzw=="),
      ... "CategoryIds" : [
      ... BinData(3,"BXzpwVQozECLaPkJy26t6Q=="),
      ... BinData(3,"ox303ZeM50KelvoUbPBJ8Q=="),
      ... BinData(3,"26ziaY+G9UKMyjmtVkkhcg=="),
      ... BinData(3,"D2X8vObte0eJHNcDfp2HBw==")
      ... ],
      ... "ShopId" : BinData(3,"ZdfPmrlKR0GkLPC4djJuKw=="),
      ... "BrandId" : BinData(3,"kCHyuyLvgECxPF1nxwr7qQ=="),
      ... "Created" : ISODate("2012-08-24T07:42:12.416Z"),
      ... "LastActivity" : ISODate("2013-01-14T19:38:11.776Z"),
      ... "Price" : 129.9,
      ... "Sale" : false,
      ... "Rating" : 11.057340703605368,
      ... "RatingTimed" : 0.05670431130054035,
      ... "Available" : null,
      ... "FreeDelivery" : null,
      ... "Attrs" : [
      ... null,
      ... null,
      ... null,
      ... null
      ... ]
      ... }
      ... )
      > db.xxx.find({"Attrs":null}).pretty()
      {
          "_id" : BinData(3,"ch9PrWveqU6niB6FGVhIOg=="),
          "PeerGroup" : "male",
          "ProductId" : BinData(3,"weRiKOtXEUSDZHkGHLcwzw=="),
          "CategoryIds" : [
              BinData(3,"BXzpwVQozECLaPkJy26t6Q=="),
              BinData(3,"ox303ZeM50KelvoUbPBJ8Q=="),
              BinData(3,"26ziaY+G9UKMyjmtVkkhcg=="),
              BinData(3,"D2X8vObte0eJHNcDfp2HBw==")
          ],
          "ShopId" : BinData(3,"ZdfPmrlKR0GkLPC4djJuKw=="),
          "BrandId" : BinData(3,"kCHyuyLvgECxPF1nxwr7qQ=="),
          "Created" : ISODate("2012-08-24T07:42:12.416Z"),
          "LastActivity" : ISODate("2013-01-14T19:38:11.776Z"),
          "Price" : 129.9,
          "Sale" : false,
          "Rating" : 11.057340703605368,
          "RatingTimed" : 0.05670431130054035,
          "Available" : null,
          "FreeDelivery" : null,
          "Attrs" : [
              null,
              null,
              null,
              null
          ]
      }
      

      请将上述序列复制到您的 mongo shell 并在此处发布结果。

      【讨论】:

        猜你喜欢
        • 2019-11-14
        • 2014-01-16
        • 1970-01-01
        • 2016-03-24
        • 2019-04-15
        • 1970-01-01
        • 1970-01-01
        • 2017-05-12
        • 1970-01-01
        相关资源
        最近更新 更多