我是MongoDb的新手。我有下面的MongoDB数据库。我有一个List of product Ids.I,需要一种方法来获得所有匹配产品的产品对象,Ids.This可以使用LINQ来实现,就像this.How一样,我可以创建过滤器来实现同样的结果。
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,.There是order的一些约束,但在我的例子中,订单没有restrictions.How,我可以修改相同的吗?

我使用以下驱动程序

发布于 2020-02-05 16:16:18
构建过滤器,如下所示:
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; }
}发布于 2020-02-05 17:44:03
这个聚合管道应该可以做到这一点:
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();
}
}
}
https://stackoverflow.com/questions/60070022
复制相似问题