我想知道如何通过官方 C# 驱动程序版本 1.7 查询 MongoDB 集合以获取嵌入式文档(在数组中)?通过查询嵌入式文档,我的意思是我只想检索嵌入式文档而不是包含它的文档,AKA projection。
我查询的是带有嵌入式文档的数据模型示例:
// Library, contained in db.Libraries
{
_id: 1,
Categories: [{_id: 2, Name: "Classics", Books: [{_id: 3, Name: The Count of Monte Cristo}]}]
}
这里的问题是如何在图书馆集合中查询具有_id
1 的对象和其中一本书具有_id
3 的对象,并且只返回这本书。它完全可行吗?据我所知,可以通过 MongoDB shell 中的投影来做到这一点。
我的示例查询是查询 db.Libraries 中包含_id
3 的书,该书包含在 1 的库中_id
。返回的书将是这个子文档:
{_id: 3, Name: The Count of Monte Cristo}]}
我已经查看了如何使用 MongoDB 的官方 C# 驱动程序检索嵌入式文档的问题?,但我不能让接受的答案对我有用。
编辑:
我现在可以看到如何使用 MongoDB 的官方 C# 驱动程序检索嵌入式文档的已接受答案?作品,有点。我没有看到它遍历每个找到的文档,相当于:
var libraryCollection = new MongoCollection<Library>();
var refBook = new Book { Id = ObjectId.GenerateNewId().ToString(), Name = "The Count of Monte Cristo" };
libraryCollection.Insert(new Library { Id = ObjectId.GenerateNewId().ToString(), Categories = new[] { new Category { Books = new[] { refBook } } } });
MongoCursor<Library> libraries = libraryCollection.Find(new QueryDocument(
new Dictionary<string, object>
{
{"_id", new ObjectId()},
}
));
Book book;
foreach (var library in libraries)
{
book = library.Categories.SelectMany(c => c.Books).FirstOrDefault(b => b.Id == refBook.Id);
}
但是,此解决方案没有实际意义,因为它检索整个 Library 文档,而不仅仅是嵌入的 Book 文档。我真的只需要反序列化嵌入式 Book,AKA projection。