我有这样的文件集合
[
{ "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.
答案 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/