2016-11-28 123 views
1

我有這樣一個方案的集合:MongoDB的嵌套查詢刪除

[ 
    Folder: { 
     _id: ObjectId(...), 
     Item: [{ 
      _id: ObjectId(...), 
      Version: [{ 
       _id: ObjectId(...), 
       ConfirmedDevices: [ObjectId(...), ...] 
      }, ...] 
     }, ...] 
    } 
] 

我需要從ConfirmedDevices陣列的每一個項目的每一個版本去除一定的ID在一定Folder。換句話說,我有一個folderId,我需要通過選擇文件夾。然後我有一個id列表,其中需要從該文件夾中存在的所有已確認設備中刪除

我需要通過C#驅動程序來做到這一點。其實我已經寫了這樣做的代碼,但是這需要查詢文件夾中每個項目的每個版本的數據庫。這會導致文件夾上的許多項目出現性能問題。

我在說的是這個邏輯,把它當作一個僞代碼。

for (int i = 0; i < folder.items.Count; i++) 
{ 
    for (int j = 0; j < item.versions.Count; j++) 
    { 
     db.folders.update(
      {"_id": ObjectId("...") }, 
      { $pull: { "Items." + i + ".Versions." + j + ".ConfirmedDevices": { $in: [ ObjectId("...") ] } } }, 
      { multi: true } 
     ); 
    } 
} 

我知道mongodb的嵌套查詢是在概念的黑暗和貧窮的一面。但我無法證實這是不可能的。

有反正我可以一勞永逸嗎? (經常mongodb查詢就足夠了,我可以將它轉換成C#版本)

回答

0

我認爲$ elemMatch是你所缺少的。這將允許您使用嵌入文檔中的字段標識項目。這與在$ $,並結合拉你就能實現你想要的

MongoDB Documentation - ElemMatch

+0

是否有您能詳細點什麼辦法?也許舉一個例子吧? –