MongoDB C# Driver筛选含指定Sizeid的数组元素问题求助
问题解决:MongoDB C# Driver 筛选嵌套数组元素
错误原因分析
你的代码里第一个筛选条件存在字段名拼写错误:将集合中的_id字段写成了temid,这是导致无法匹配到目标文档的核心问题。此外,如果你的需求是仅返回itemLists中Sizeid=2的子文档,当前代码会返回整个父文档的所有itemLists元素,需要额外添加投影操作。
修正后的代码
1. 匹配文档并返回完整父文档(包含所有itemLists元素)
如果只需要确认文档存在并获取完整数据,修正字段名即可:
var filter = Builders<Item>.Filter.Eq(x => x._id, ItemId); // 修正字段名:temid -> _id var filter2 = Builders<Item>.Filter.ElemMatch(x => x.itemLists, Builders<ItemList>.Filter.Eq(x => x.Sizeid, sizeId)); var data = await Context.GetCollection<Item>("Item").Find(filter & filter2).FirstOrDefaultAsync();
2. 匹配文档并仅返回符合条件的itemLists子文档
如果需要只保留itemLists中Sizeid=2的元素,需添加投影操作:
var filter = Builders<Item>.Filter.Eq(x => x._id, ItemId); var elemMatchFilter = Builders<Item>.Filter.ElemMatch(x => x.itemLists, il => il.Sizeid == sizeId); // 投影:仅返回匹配的itemLists元素 var projection = Builders<Item>.Projection.ElemMatch(x => x.itemLists, il => il.Sizeid == sizeId); var data = await Context.GetCollection<Item>("Item") .Find(filter & elemMatchFilter) .Project(projection) .FirstOrDefaultAsync();
你的集合数据(格式化后)
{ "_id": NumberInt(2), "ItemName": "Shirt", "ItemDescripton": "Men Trouser", "itemLists": [ { "CategoryId": NumberInt(1), "CategpryName": "Men", "ColorId": NumberInt(1), "ColorName": "Red", "InitialQty": NumberInt(30), "AvailableQty": NumberInt(28), "ReserveQty": NumberInt(2), "Price": 4560.0, "OfferPrice": 670.0, "Images": [ "/assets/Images/Men/m4.jpg", "/assets/Images/Men/m5.jpg" ], "Sizeid": NumberInt(2), "SizeName": "XL", "DetailId": NumberInt(0), "DeliveryCharges": NumberInt(20), "Brand": "Allen Solly", "CreatedOn": ISODate("2022-12-07T17:10:19.881+0000"), "CreatedBy": "string", "Active": true }, { "CategoryId": NumberInt(1), "CategpryName": "Men", "ColorId": NumberInt(2), "ColorName": "Blue", "InitialQty": NumberInt(10), "AvailableQty": NumberInt(6), "ReserveQty": NumberInt(4), "Price": 1400.0, "OfferPrice": 1200.0, "Images": [ "/assets/Images/Men/m3.jpg", "/assets/Images/Men/m4.jpg" ], "Sizeid": NumberInt(1), "SizeName": "XL", "DetailId": NumberInt(0), "DeliveryCharges": NumberInt(120), "Brand": "Allen Solly", "CreatedOn": ISODate("2022-12-07T17:10:19.881+0000"), "CreatedBy": "string", "Active": true } ] }
内容的提问来源于stack exchange,提问作者Atul Srivastava
相关产品推荐
相关产品推荐

