gpt4 book ai didi

c# - Mongo C# 驱动程序使用 elemMatch 时如何从投影中排除元素?

转载 作者:可可西里 更新时间:2023-11-01 10:37:40 24 4
gpt4 key购买 nike

我有一个名为“Trades”的集合。这是集合的结构:

{
"TradeId": 1234,
"Products": [
{
"Name": "Test product",
"Offers": [
{
"SupplierName": "John Smith",
"OfferPrice": 12345.6
}],
"Requests": [
{
"CustomerName": "Anna Doe",
"RequestPrice": 28574.5
}]
}]
}

在按产品名称过滤时,我只需要获取指定交易的“报价”数组。这是我到目前为止所做的:

            var filteredTrade = await _tradesCollection.Find(
x => x.TradeId == 1234)
.Project<Trade>(Builders<Trade>.Projection.ElemMatch(
x => x.Products,
i => i.Name == "Test product"))
.SingleOrDefaultAsync();

这正如预期的那样按产品名称过滤。但是,查询还会获取整个请求集合。有什么方法可以让我提供集合或以某种方式排除请求集合?

最佳答案

您需要聚合框架来投影具有多层嵌套数组的文档。在 mongo shell 中,您可以尝试以下代码:

db.col.aggregate([
{
$match: { TradeId: 1234 }
},
{
$unwind: "$Products"
},
{
$match: { "Products.Name": "Test product" }
},
{
$project: {
_id: 0,
Offers: "$Products.Offers"
}
}
])

打印:{ "Offers": [ { "SupplierName": "John Smith", "OfferPrice": 12345.6 } ] }

可以转换为以下 C# 代码(返回 Product 类型的列表):

var project = new BsonDocumentProjectionDefinition<BsonDocument>(
BsonDocument.Parse("{ Offers: \"$Products.Offers\", _id: 0 }"));

var q = Col.Aggregate()
.Match(x => x.TradeId == 1234)
.Unwind<Trade>(x => x.Products)
.Match(x => x["Products.Name"] == "Test product")
.Project(project)
.As<Product>()
.ToList();

关于c# - Mongo C# 驱动程序使用 elemMatch 时如何从投影中排除元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53957914/

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