13

我的收藏中的对象看起来像:

{ 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})

没有结果。

4

3 回答 3

35

为了查找带有数组的文档,带有空元素,请运行:

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

根据safaribooksonline正确null匹配使用$in(因为你不能使用$eqwith null)。此外,与null

{"something":null}

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

于 2015-04-14T11:27:34.960 回答
-1

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

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

MongoDB shell 版本:2.4.0 连接到:test

> 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 并在此处发布结果。

于 2013-04-07T03:59:54.210 回答
-1

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

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

于 2013-04-08T07:50:18.767 回答