MongoDb查询包含空值的数组

14

我收藏的物品看起来像这样:

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

我想查询那些包含 null 值作为数组元素的对象。查询:

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

不起作用,似乎只能找到MyArray为null的对象,例如:

{ 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 ] }。是否符合预期...? - Joachim Isaksson
查询应该可以正常工作。请展示您的真实数据和查询。 - Kirill Zorin
我在我的问题中添加了真实数据和查询。 - Mads
我无法使用您的数据和查询重现您的问题 - 它可以正常工作(MongoDB 2.4.1)。请问您使用的是哪个版本的MongoDB? - ronasta
如果您能标记我的答案,那就太好了。我并不想显得无礼,但是很多时候我会自己回来参考它 :) - Krystian
4个回答

38
为了查找包含空元素数组的文档,请运行以下命令:
db.collection.find({"keyWithArray":{$elemMatch:{"$in":[null], "$exists":true}}})

根据safaribooksonline,正确匹配null需要使用$in(因为无法使用$eqnull进行比较)。 此外,与null进行比较:
{"something":null}

将匹配字段设置为 null 的文档以及没有具有 "something" 字段的所有文档。因此,我们必须使用 $exists 确保该键存在。


0
MongoDb查询带有空值过滤器:
{field: {$in: [null]}}

-1

好的,我通过使用C#驱动程序加载我的“null”候选项来解决了这个问题,结果发现这些值并不是null,而是Bson Undefined!它们在shell中显示为“null”!请参见http://jira.mongodb.org/browse/SERVER-2426。 这个方法可行:

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


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接