Фильтр MongoDb для получения документа продукта в документе заказа - PullRequest
1 голос
/ 05 февраля 2020

Я новичок в MongoDb. У меня есть следующая база данных MongoDB. У меня есть List of product Ids. Мне нужен способ получить объекты продукта для всех соответствующих идентификаторов продукта. Это может быть достигнуто с помощью LINQ, как это. Как я могу создать фильтры для достижения того же результата.

this.Collection.AsQueryable().SelectMany(order => order.Products).Where(product => ids.Contains(product.Id))

Пример фильтра, используемого в коде:

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. Есть некоторые ограничения для order, но в моем В этом случае порядок не имеет ограничений. Как я могу изменить то же самое?

enter image description here

Я использую следующий драйвер

enter image description here

Ответы [ 2 ]

0 голосов
/ 05 февраля 2020

этот конвейер агрегации должен это сделать:

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();

тестовая программа:

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 голосов
/ 05 февраля 2020

Построить фильтр следующим образом:

var filter = MongoDB.Driver.Builders<Order>.Filter.AnyIn("products.id", productIds);

Как только вы получите список заказов, вы можете запросить список продуктов по LINQ.

Вот мой пример:

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; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...