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

Mongo C#驱动程序在使用elemMatch时如何从投影中排除元素?,c#,mongodb,C#,Mongodb,我有一个名为“交易”的收藏。这是该系列的结构: { "TradeId": 1234, "Products": [ { "Name": "Test product", "Offers": [ { "SupplierName": "John Smith", "OfferPrice": 12345.6 }], "Requests": [ { "Cust

我有一个名为“交易”的收藏。这是该系列的结构:

{
 "TradeId": 1234,
 "Products": [
  {
     "Name": "Test product",
     "Offers": [
        {
           "SupplierName": "John Smith",
           "OfferPrice": 12345.6
        }],
     "Requests": [
        {
           "CustomerName": "Anna Doe",
           "RequestPrice": 28574.5
        }]
   }]
}
我只需要获取指定交易的“Offers”数组,同时按产品名称进行筛选。以下是我迄今为止所做的工作:

            var filteredTrade = await _tradesCollection.Find(
                        x => x.TradeId == 1234)
                    .Project<Trade>(Builders<Trade>.Projection.ElemMatch(
                        x => x.Products,
                        i => i.Name == "Test product"))
                    .SingleOrDefaultAsync();
var filteredTrade=wait\u tradesCollection.Find(
x=>x.TradeId==1234)
.项目(Builders.Projection.ElemMatch)(
x=>x.产品,
i=>i.Name==“测试产品”))
.SingleOrDefaultAsync();

这将按产品名称进行筛选,正如预期的那样。但是,该查询还获取整个requests集合。有什么方法可以让我只获取offers集合或以某种方式排除requests集合吗?

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

db.col.aggregate([
    {
        $match: { TradeId: 1234 }
    },
    {
        $unwind: "$Products"
    },
    {
        $match: { "Products.Name": "Test product" }
    },
    {
        $project: {
            _id: 0,
            Offers: "$Products.Offers"
        }
    }
])
打印:
{“报价”:[{“供应商名称”:“约翰·史密斯”,“报价人”:12345.6}]}

可转换为以下C代码(返回类型
产品的列表)

var project=new BsonDocumentProjectionDefinition(
Parse(“{Offers:\”$Products.Offers\”,\u id:0}”);
var q=集合()列
.Match(x=>x.TradeId==1234)
.展开(x=>x.产品)
.Match(x=>x[“Products.Name”]==“测试产品”)
.项目(项目)
.As()
.ToList();
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();