首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于获取订单文档中的产品文档的MongoDb过滤器

用于获取订单文档中的产品文档的MongoDb过滤器
EN

Stack Overflow用户
提问于 2020-02-05 14:23:05
回答 2查看 132关注 0票数 1

我是MongoDb的新手。我有下面的MongoDB数据库。我有一个List of product Ids.I,需要一种方法来获得所有匹配产品的产品对象,Ids.This可以使用LINQ来实现,就像this.How一样,我可以创建过滤器来实现同样的结果。

代码语言:javascript
复制
this.Collection.AsQueryable().SelectMany(order => order.Products).Where(product => ids.Contains(product.Id))

代码中使用的示例筛选器为

代码语言:javascript
复制
var productFilter = Builders<OrderInfo>.Filter.In(order => order.AssignedWareHouse, productids) &  Builders<OrderInfo>.Filter.Where(order => order.Status == OrderStatus.AssignedToPickup || order.Status == OrderStatus.Stored || order.Status == OrderStatus.Initiated || order.Status == OrderStatus.OnHold);

这个过滤器是用于列表的userids,.There是order的一些约束,但在我的例子中,订单没有restrictions.How,我可以修改相同的吗?

我使用以下驱动程序

EN

回答 2

Stack Overflow用户

发布于 2020-02-05 16:16:18

构建过滤器,如下所示:

代码语言:javascript
复制
var filter = MongoDB.Driver.Builders<Order>.Filter.AnyIn("products.id", productIds);

获得订单列表后,您可以通过LINQ查询产品列表。

下面是我的例子:

代码语言:javascript
复制
class Program
{
    static void Main(string[] args)
    {
        var client = new MongoClient("{connection string}");
        var database = client.GetDatabase("{database}");
        var collection = database.GetCollection<Order>("{collection}");
        ConventionRegistry.Remove("__defaults__");

        var productIds = new List<int> { 1,2 };
        var filter = Builders<Order>.Filter.AnyIn("products.id", productIds);
        var orders = collection.Find(filter).ToList();
        var products = orders.SelectMany(o => o.Products).Where(p => productIds.Contains(p.Id));
    }
}

class Product
{
    [BsonElement("id")]
    public int Id { get; set; }
    [BsonElement("name")]
    public string Name { get; set; }
}

class Order
{
    [BsonElement("id")]
    public int Id { get; set; }
    [BsonElement("comment")]
    public string Comment { get; set; }
    [BsonElement("products")]
    public List<Product> Products { get; set; }
}
票数 0
EN

Stack Overflow用户

发布于 2020-02-05 17:44:03

这个聚合管道应该可以做到这一点:

代码语言:javascript
复制
var products = collection.Aggregate()
               .Match(Builders<OrderInfo>.Filter.ElemMatch(
                           o => o.Products,
                           p => productIDs.Contains(p.Id)) &
                      Builders<OrderInfo>.Filter.Where(
                           o => o.Status == OrderStatus.AssignedToPickup ||
                                o.Status == OrderStatus.Initiated ||
                                o.Status == OrderStatus.OnHold ||
                                o.Status == OrderStatus.Stored))
               .Unwind(o=>o.Products)
               .ReplaceWith<Product>("$Products")
               .Match(p => productIDs.Contains(p.Id))
               .ToList();

测试程序:

代码语言:javascript
复制
using MongoDB.Driver;
using MongoDB.Entities;
using MongoDB.Entities.Core;
using System;
using System.Linq;

namespace StackOverFlow
{
    public enum OrderStatus
    {
        AssignedToPickup,
        Stored,
        Initiated,
        OnHold,
        Excluded
    }

    public class OrderInfo : Entity
    {
        public Product[] Products { get; set; }
        public OrderStatus Status { get; set; }
    }

    public class Product
    {
        public Guid Id { get; set; }
    }

    public static class Program
    {
        private static void Main()
        {
            new DB("test-db");

            var productIDs = new[] { Guid.NewGuid(), Guid.NewGuid() };

            var orders = new[] {
                new OrderInfo {
                    Status = OrderStatus.Excluded,
                    Products = new[] { new Product { Id = productIDs[0] } } },
                new OrderInfo {
                    Status = OrderStatus.Initiated,
                    Products = new[] { new Product { Id = productIDs[1] } } }
            };

            orders.Save();

            var products = DB.Fluent<OrderInfo>()
                             .Match(f =>
                                    f.ElemMatch(o => o.Products,
                                                p => productIDs.Contains(p.Id)) &
                                    f.Where(o => o.Status == OrderStatus.AssignedToPickup ||
                                                 o.Status == OrderStatus.Initiated ||
                                                 o.Status == OrderStatus.OnHold ||
                                                 o.Status == OrderStatus.Stored))
                             .Unwind(o => o.Products)
                             .ReplaceWith<Product>("$Products")
                             .Match(p => productIDs.Contains(p.Id))
                             .ToList();
        }
    }
}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60070022

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档