MongoDB:查找与其所有子文档中的条件匹配的文档

时间:2014-12-04 11:43:00

标签: mongodb

我正在尝试编写一个mongo查询来获取满足所有子文档条件的结果,

1. { 
    "_id" : 1, 
    "data" : [
        {
            "Id" : "513", 
            "Nom" : "alouale pfouga", 
        }
    ], 
    "campaigns" : [
        {
            "user" : "1", 
            "latest" : NumberInt(0),             
            "postcode" : [
                [

                ]
            ], 
        }, 
        {
            "user" : "2", 
            "latest" : NumberInt(1), 
            "postcode" : [
                {
                    "id" : "772", 
                    "name" : "xxx", 
                }
            ], 

        }
    ], 

}

2. { 
    "_id" : 2, 
    "data" : [
        {
            "Id" : "514", 
            "Nom" : "pfouga remi", 
        }
    ], 
    "campaigns" : [
        {
            "user" : "1", 
            "latest" : NumberInt(0),             
            "postcode" : [
                [

                ]
            ], 
        }, 
    ], 

}

我需要找到包含" Postcode"的记录。数组是空的。 据我所知这样的查询:db.users.find({"campaigns.postcode":[]})给了我两条记录,但我只需要record 2,因为record 1在一个子文档中有邮政编码节点,请有人帮帮我!!!

2 个答案:

答案 0 :(得分:4)

这会给你答案:

db.test.find({ 'campaigns.postcode': { $size: 0 } } )

但在你的情况下'campaigns.postcode'中有一个空数组,这意味着大小不是0,它是1

你应该删除你的空数组

"postcode" : [
   [
   ]
], 

应该是

"postcode" : []

<强>更新 在问题上花了一些时间后我意识到了问题

要将"postcode" : [[]]转换为"postcode" : [],您可以使用以下代码:

db.test.find({ 'campaigns.postcode': []} ).forEach(function(item){
    for(var i0 = 0; i0 < item.campaigns.length; i0++)
    {        
        if(item.campaigns[i0].postcode[0].length == []) item.campaigns[i0].postcode = [];
    }

    db.test.update({'_id' : item._id}, item);
});

之后,您可以通过以下方式找到合适的结果:

db.test.find({ 'campaigns.postcode': { $size: 0 }, 'campaigns': { $size: 1 } } )

答案 1 :(得分:1)

在你的json结构中它包含

"postcode" : [ [ ] ],

所以我尝试了一些,但没有找到你想要的预期结果我发现邮政编码数据所有邮政编码是空的使用以下聚合

db.collectionName.aggregate({"$unwind":"$campaigns"},
     {"$unwind":"$campaigns.postcode"},
      {"$match":{"campaigns.postcode":{"$size":0}}})