2016-11-28 94 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

是否有您能详细点什么办法?也许举一个例子吧? –