mongodb检查元素有一个嵌套属性

时间:2013-08-21 14:25:43

标签: mongodb mongodb-query

我有这样的文件集合

[
{ "name": "pika", "attrs": { "A": 1, "B": 2 ...  } },
{ "name": "chu", "attrs": { "C": 3 } },
{ "name": "plop", "attrs": { "A": 1, "C": 3 } }
]

我想使用mongodb 2.4删除“attrs”(名为“chu”的行)中具有“C”和“C”属性的记录。 attrs键下可能的属性数量可能很大(> 100)。

我可以使用多个查询。

你会怎么做?

编辑:我想在包含其他属性的行中保留attr C.

2 个答案:

答案 0 :(得分:1)

你有两个选择。如果您的密钥空间很小,您可以

db.collection.remove( {C : {$exists:true}, A: {$exists:false}, B: {$exists: false} })

否则你需要做

var col = db.collection.find( {C : {$exists:true}} );
for(doc in col) {
    var found = false
    for(key in obj) {
        if( key !== 'C' ) {
            found = true;
            break;
        }
    }
    if(found === false) {
        db.collection.remove(doc);
    }
}

没有办法在MongoDB中直接计算文档中的键数,也无法在键名中查询通配符(例如,你不能做“键不等于C:{$ exists:false}” )。因此,您需要显式测试所有键或测试应用程序层中的每个文档。

答案 1 :(得分:1)

如果“attrs”是一个数组,换句话说,你就是这样的集合:

{ "name": "pika", "attrs": [{ "A": 1}, {"B": 2}] };
{ "name": "chu", "attrs": [{ "C": 3 }] };
{ "name": "plop", "attrs": [{ "A": 1}, {"C": 3 }] }

然后你可以写下面的查询来找到你想要的特定记录:

db.entities.find({"attrs.C": {$exists: true}, "attrs": {$size: 1}});

您可以查看mongodb网站以查找$ size操作http://docs.mongodb.org/manual/reference/operator/size/