gpt4 book ai didi

c# - MongoDB/C# 如何只查询深度嵌套的数组?

转载 作者:行者123 更新时间:2023-12-01 23:47:00 26 4
gpt4 key购买 nike

我已经厌倦了我无法弄清楚(也不是单独也不是通过 SO)如何直接在 BsonDocument 或自定义类中提取深度嵌套的数据。我知道我应该确保使用过滤器和投影来获取嵌套在另一个数组中的 Guid 的数组/列表。以下是结构(简化):

//Thread
{
Id: "B2",
Answers: [
{
Id: "A1",
Likes: [ "GUID1", "GUID2", "ETC" ] //<- this array, and only this.
}
]
}

我将 Thread.IdAnswer.Id 作为过滤数据,但后来我尝试了:

var f = Builders<BsonDocument>.Filter;
var filter = f.And(f.Eq("Id", ids.ThreadId), f.Eq("Answers.$[].Id", ids.AnswerId));
var projection = Builders<BsonDocument>.Projection.Include("Answers.Likes.$");
var likes = await dbClient.GetCollection<BsonDocument>(nameof(Thread))
.Find(filter)
.Project(projection)
.FirstOrDefaultAsync();

但是这个查询总是返回 null,我从这个 POV 做错了什么?

最佳答案

无法使用常规查询从数组中投影单个字段。

您最多可以使用常规查询投影匹配元素,然后映射类似元素。

有点像

var f = Builders<BsonDocument>.Filter;
var filter = f.And(f.Eq("Id", ids.ThreadId), f.Eq("Answers.Id", ids.AnswerId));
var projection = Builders<BsonDocument>.Projection.Include("Answers.$");
var answer = await dbClient.GetCollection<BsonDocument>(nameof(Thread))
.Find(filter)
.Project(projection)
.FirstOrDefaultAsync();

或者,您可以将过滤器与使用聚合的映射一起使用,以通过 id 匹配答案元素,然后投影以映射 like 字段。

有点像

var f = Builders<BsonDocument>.Filter;
var match = f.And(f.Eq("Id", ids.ThreadId), f.Eq("Answers.Id", ids.AnswerId));

var project = new BsonDocument("newRoot",
new BsonDocument("$arrayElemAt", new BsonArray {
new BsonDocument("$map",
new BsonDocument
{
{ "input",
new BsonDocument("$filter", new BsonDocument
{
{ "input", "$Answers"},
{"cond", new BsonDocument("$eq", new BsonArray { "$$this.Id", ids.AnswerId})}
})
},
{ "in", new BsonDocument("Likes", "$$this.UserLikes") }
}),
0}));

var pipeline = collection.Aggregate()
.Match(match)
.AppendStage<BsonDocument, BsonDocument, BsonDocument>(new BsonDocument("$replaceRoot", project));

var list = pipeline.ToList();

这里的工作示例 - https://mongoplayground.net/p/wM1z6q92_mV

关于c# - MongoDB/C# 如何只查询深度嵌套的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64031784/

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