Как получить документ вместе с одним из его дочерних документов в C#? - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть следующий документ в пн go

{"_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;

, но это просто приводит к возврату документа root и всех дочерних элементов вместо только документ root и единственный ребенок, которого я искал.

1 Ответ

0 голосов
/ 03 апреля 2020

Вы можете проецировать соответствующий документ в массив с помощью позиционного оператора. Это [-1] в C# (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();

...