1

我有一组这样的文件

[
{ "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 保留在包含其他属性的行中。

4

2 回答 2

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/

于 2013-08-22T08:14:14.380 回答
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 中计算文档中的键数,也无法查询键名中的通配符(例如,您不能执行“key not equal to C: {$exists: false}”)。因此,您要么需要显式测试所有键,要么测试应用层中的每个文档。

于 2013-08-21T15:05:37.317 回答