我收集了像这样的文件
[
{ "name": "pika", "attrs": { "A": 1, "B": 2 ... } },
{ "name": "chu", "attrs": { "C": 3 } },
{ "name": "plop", "attrs": { "A": 1, "C": 3 } }
]我想删除使用MongoDB2.4的记录中只有"C“和"C”属性的记录。attrs键下的可能属性的数量可能很大(> 100)。
我可以使用几个查询。
你会怎么做?
编辑:我想在包含其他属性的行中保持attr C。
发布于 2013-08-21 15:05:37
你有两个选择。如果你的关键空间很小,你可以做。
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不等于C:{$exists: false}")。因此,您需要显式地测试所有键,或者测试应用程序层中的每个文档。
发布于 2013-08-22 08:14:14
如果"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/
https://stackoverflow.com/questions/18360133
复制相似问题