gpt4 book ai didi

c# - 如何通过 C# 驱动程序向 MongoDB 查询嵌入式文档?

转载 作者:可可西里 更新时间:2023-11-01 10:05:16 25 4
gpt4 key购买 nike

我想知道如何通过 official C# driver 查询 MongoDB 集合中的嵌入式文档(在数组中) 1.7版?通过查询嵌入式文档,我的意思是我只想检索嵌入式文档,而不是包含它的文档,即 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,并仅返回 Book。它完全可行吗?据我所知,可以通过 MongoDB shell 中的投影来完成此操作。

我的示例查询是在 db.Libraries 中查询 _id 3 的 Book,该 Book 包含在 _id 1 的 Library 中。返回的 Book 将是这个子文档:

{_id: 3, Name: The Count of Monte Cristo}]}

我看过问题 How to retrieve an embedded document using the official C# driver for MongoDB? ,但我无法让已接受的答案为我工作。

编辑:

我现在可以看到 How to retrieve an embedded document using the official C# driver for MongoDB? 的已接受答案有效,有点。我没有看到它遍历每个找到的文档,等同于:

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);
}

但是,此解决方案没有实际意义,因为它检索整个库文档而不仅仅是嵌入的图书文档。我真的只需要反序列化嵌入的书,AKA projection .

最佳答案

要执行生成的文档不仅被过滤而且被 reshape 的投影,您需要使用 Aggregate而不是像这样的 Find 方法之一:

var result = collection.Aggregate(
// Only include the document where _id = 1
new BsonDocument {{"$match", new BsonDocument {{"_id", 1}}}},
// 'Unwind' the Categories array by duplicating the docs, one per element.
new BsonDocument {{"$unwind", "$Categories"}},
// Now do the same for the Books array inside each Categories element.
new BsonDocument {{"$unwind", "$Categories.Books"}},
// Only include the resulting docs with a Book _id of 3
new BsonDocument {{"$match", new BsonDocument {{"Categories.Books._id", 3}}}},
// Reshape the document to bring the book attributes out to the top level
new BsonDocument {{"$project", new BsonDocument {
{"_id", "$Categories.Books._id"},
{"Name", "$Categories.Books.Name"}
}}}
);

result.Response.toJson():

{"result": [{ "_id": 3.0, "Name": "The Count of Monte Cristo" }], "ok": 1.0 }

关于c# - 如何通过 C# 驱动程序向 MongoDB 查询嵌入式文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14538306/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com