gpt4 book ai didi

c# - MongoDB c# 使用定义生成器检索文档中数组中的所有匹配元素

转载 作者:行者123 更新时间:2023-11-30 21:28:38 24 4
gpt4 key购买 nike

我有一个文档,在结构上看起来像这样,带有嵌套的子文档

{  
"_id":ObjectId("50419077c2e6a1e18a489a0f"),
"user":"Jone Doe",
"fooArray":[
{
"plot":"circle",
"color":"yellow",
},
{
"plot":"circle",
"color":"red",
},
{
"plot":"square",
"color":"green",
}
]
}

我想在这个有圆形图的文档中检索 fooArray 中的所有匹配元素。

这是我试过的

var filter = FilterBuilder.filter.Eq(doc => doc.User, User);
var projection = ProjectionBuilder
.Exclude(doc => doc.Id)
.Exclude(doc => doc.User)
.Include(doc => doc.FooArray)
.ElemMatch(x => x.FooArray, y => y.Plot == "circle");

var definition = new OperationDefinitions<ShapeDocument> { Filter = filter };
return await Performer.Perform(definition, async (def, collection) =>
{
var findResult = collection.Find(def.Filter).Project(projection);

var result = await findResult.SingleOrDefaultAsync();
});

这是我得到的

{  
"fooArray":[
{
"plot":"circle",
"color":"yellow",
}
]
}

但它只给了我第一个匹配的元素,而不是所有具有 plot 等于 circle 的元素

{  
"fooArray":[
{
"plot":"circle",
"color":"yellow",
},
{
"plot":"circle",
"color":"red",
}
]
}

我确实阅读了提到的 mongodb 文档

“$elemMatch 运算符将查询结果中的字段内容限制为仅包含与 $elemMatch 条件匹配的第一个元素。”

不太确定如何实现!

最佳答案

这个问题没有完全描述用例,所以我根据一些假设提出了一些可供您探索的潜在选项,特别是它们依赖于 LINQ 可用并且以单个文档为目标一次(你可能不想要比你真正需要的更多的代码):

1) 你所拥有的变化。使用带有投影和 LINQ 表达式的标准 find

var projection = Builders<ShapeDocument>.Projection
.Expression(x => x.fooArray.Where(y => y.plot == "circle"));

var items1 = collection
.Find(x => x.user == "Jone Doe")
.Project(projection)
.ToList();

2) 使用聚合管道(你可以使用与上面相同的投影)

var pipeline = collection
.Aggregate()
.Match(x => x.user == "Jone Doe")
.Project(i => new
{
x = i.fooArray.Where(x => x.plot == "circle")
});

var items2 = pipeline.SingleOrDefault();

3) 将包含所有数组元素的文档拉回,然后使用 LINQ 在本地进行过滤。从好的方面来说,这是少量可读代码,但是,它确实会在过滤之前返回整个文档。根据您的具体用途,这可能是可以接受的。

var items3 = collection.AsQueryable()
.SingleOrDefault(x => x.user == "Jone Doe")
.fooArray.Where(x => x.plot == "circle");

如果 LINQ 真的不是一个选项,那么有一个例子 here这显示了如何将投影转换为不是我们的 LINQ。完全未经测试,但会是这样的:

var filter = new BsonDocument {
{"input", "$items"},
{"as", "item" },
{"cond", new BsonDocument {
// Fill in the condition values
{ "", new BsonArray { "", xxx } } }
}
};

var project = new BsonDocument {
{ "items", new BsonDocument { { "$filter", filter} } }
};

var pipeline = collection.Aggregate().Project(project);

关于c# - MongoDB c# 使用定义生成器检索文档中数组中的所有匹配元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56225026/

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