【问题标题】:How do I retrieve a document along with just one of its child documents in C#?如何在 C# 中检索一个文档及其其中一个子文档?
【发布时间】:2020-04-01 23:54:50
【问题描述】:

我在 mongo 中有以下文档

{"_id":{"$oid":"5e7b6cb9606503483494c63a"},"ProductId":{"$binary":{"base64":"V9+9bOaj8kyWrPwdAm0rBQ==","subType":"03"}},"ProductName":"TestProduct1","ProductItems":[{"_t":"ProductItem","ProductId":{"$binary":{"base64":"V9+9bOaj8kyWrPwdAm0rBQ==","subType":"03"}},"Code":"TP1A"},
{"_t":"ProductItem","ProductId":{"$binary":{"base64":"V9+9bOaj8kyWrPwdAm0rDE==","subType":"03"}},"Code":"TP1B"}]}

我想要做的是通过 ProductItem.Code 上的查询返回,该查询返回具有单个匹配子项的产品。因此保留了对象结构,但消除了除单个匹配子项之外的所有对象。

我试过了

Product prod = new Product();
IMongoCollection<Product> products = _database.GetCollection<Product>("Products");
var filter = Builders<Product>.Filter.ElemMatch(x=>x.ProductItems, x=>x.Code==code);
prod = products.Find(filter).FirstOrDefault();
return prod;

但这最终只会返回根文档和所有子文档,而不仅仅是根文档和我搜索的单个子文档。

【问题讨论】:

    标签: mongodb mongodb-.net-driver


    【解决方案1】:

    您可以使用位置运算符将匹配的文档投影到数组中。这是 C# 中的 [-1] (https://docs.mongodb.com/manual/reference/operator/projection/positional/)

    var filter = Builders<Product>.Filter.ElemMatch(x=>x.ProductItems, x=>x.Code==code);
    var projection = Builders< Product >.Projection.Include(x => x.ProjectItems[-1])
    
    var found = await collection.Find(filter, projection).ToListAsync();
    var matchedProductItem =  found[0].ProductItems.First();
    
    

    【讨论】:

    • 我必须做出改变“var found = products.Find(filter).Project(projection).ToList();”但是,这会导致超时。看起来这也会导致返回 ProductItem 而不是包含 ProductItem 的 Product?
    • 我的错。错误是服务器的问题。这工作谢谢。只是出于兴趣,这会返回子数组的所有元素,然后使用 linq 选择正确的元素,还是在数据库端完成所有这些?
    猜你喜欢
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    • 2015-05-16
    • 2017-06-13
    • 1970-01-01
    • 2021-10-30
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多