2013-08-21 104 views
1

我的文档这样MongoDB的检查一个元素有一个嵌套的属性

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

的集合,我想删除有“C”的记载,只有“C”的属性在他们的“ATTRS” (命名为“chu”)使用mongodb 2.4。 attrs键下可能的属性数量可能很大(> 100)。

我可以使用几个查询。

你会怎么做?

编辑:我想保持attr C包含其他属性的行。

回答

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}”)。所以你要么显式地测试所有的键,要么在应用程序层测试每个文档。

+0

我应该提到我可以有X个不同的键,X很大。我将用这个来编辑问题。但是,您提供的两种解决方案都很有趣。 – greg

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/

+0

我不知道“$ size”操作符。你的回答非常不幸,attrs不是一个数组。 – greg

相关问题