我有一个与此类方案的集合:
[
Folder: {
_id: ObjectId(...),
Item: [{
_id: ObjectId(...),
Version: [{
_id: ObjectId(...),
ConfirmedDevices: [ObjectId(...), ...]
}, ...]
}, ...]
}
]
我需要从某个Folder
中每个项目的每个版本的ConfirmedDevices
数组中删除某些ID。换句话说,我有一个文件,我需要选择该文件夹。然后,我有一个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#版本)
我认为$ lemmatch是您所缺少的。这将使您可以使用嵌入式文档中的字段来识别项目。结合$ in和$ pull,您将能够实现自己想要的东西
mongoDB文档 - Elemmatch