2013-08-21 52 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

相關問題