繁体   English   中英

需要帮助-使用 MongoDb C# 驱动程序根据特定项目 ID 过滤数组列表

[英]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条件。

您需要一个带有ElemMatchProjectionDefinition才能实现它。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM