[英]Need help - Filter list of array based on specific item id using MongoDb C# driver
我是使用 Mongodb C# 驱动程序的新手。 我的 mongodb 收藏中有以下内容。 我需要根据 _id 过滤记录,例如 Select * 来自 sql 中 _id=2 和 itemLists.Sizeid=2 的项目。
I tried like
var filter = Builders<Item>.Filter.Eq(x => x.temid, ItemId);
var filter2 = Builders<Item>.Filter.ElemMatch(x => x.itemLists, Builders<ItemList>.Filter.Eq(x => x.Sizeid,sizeId));
var data = await Context.GetCollection("Item").Find(filter&filter2).FirstOrDefaultAsync();
上面的代码没有给我预期的结果。 请帮忙。
我的 MomgoDb 收集数据如下:-
{
"_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
}
]
}
public class ItemList
{
public int CategoryId { get; set; }
public string CategpryName { get; set; }
public int ColorId { get; set; }
public string ColorName { get; set; }
public int InitialQty { get; set; }
public int AvailableQty { get; set; }
public int ReserveQty { get; set; }
public double Price { get; set; }
public double OfferPrice { get; set; }
public List<string> Images { get; set; }
public int Sizeid { get; set; }
public string SizeName { get; set; }
public int? DetailId { get; set; }
public int DeliveryCharges { get; set; }
public string Brand { get; set; }
public DateTime CreatedOn { get; set; }
public string CreatedBy { get; set; }
public bool Active { get; set; }
}
public class Item
{
[BsonId]
[BsonElement("_id")]
public int Itemid { get; set; }
public string ItemName { get; set; }
public string ItemDescripton { get;
set;}
public List<ItemList> itemLists {
get; set; }
}
public async Task<Item>
ItemDetails(int ItemId, int sizeId)
{
var filter = Builders<Item>.Filter.Eq(x => x.Itemid, ItemId);
var filter2 = Builders<Item>.Filter.ElemMatch(x => x.itemLists, Builders<ItemList>.Filter.Eq(x => x.Sizeid, sizeId));
var query = await Context.GetCollection<Item>("Item").Find(filter2&filter).FirstOrDefaultAsync();
return query;
}
根据您的问题和评论,您希望使用itemLists
数组过滤查询的文档以获取sizeId
条件。
您需要一个带有ElemMatch
的ProjectionDefinition
才能实现它。
ProjectionDefinition<Item> projection = Builders<Item>.Projection
.Include(x => x.Itemid)
.Include(x => x.ItemName)
.Include(x => x.ItemDescripton)
.ElemMatch(x => x.itemLists, Builders<ItemList>.Filter.Eq(y => y.Sizeid, sizeId));
var data = await _collection.Find(filter & filter2)
.Project<Item>(projection)
.FirstOrDefaultAsync();
演示
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.