выбор полей в документе после применения фильтра к внедренному документу - PullRequest
0 голосов
/ 21 ноября 2018

Пожалуйста, дайте мне знать эквивалент C # приведенного ниже запроса.

db.RolesNPerm.find(
   { "Roles.Name":{$in:[ "PO","role1","TO"] }},
   { _id: 1, ParentId: 1 }
)

Я пытаюсь выбрать поля (_id и ParentId) в записи, если Name ввстроенный документ (Roles) соответствует любому значению в списке.

Вот мой документ MongoDB

{
    "_id" : "1",
    "ParentId" : "par1",
    "Roles" : [ 
        {
            "Name" : "PO",
            "_id" : "5bc08ee1f12541c3aaa03084"
        }
    ]
}

Ниже приведен результат моего запроса при совпадении Role.Name«ПО» в списке имен.

{
    "_id" : "1",
    "ParentId" : "par1"
}

1 Ответ

0 голосов
/ 21 ноября 2018

Есть (как минимум) два способа сделать это:

Вы можете использовать класс Builder для построения фильтра и проекции.Проблема в том, что вы не можете выразить Roles.Name часть с помощью строго типизированных лямбда-выражений, поэтому вы можете использовать FieldDefinition тип в качестве запасного варианта

var values = new[] { "PO", "role1", "TO" };
FieldDefinition<Model, string> field = "Roles.Name";

var filter = Builders<Model>.Filter.In(field, values);
var project = Builders<Model>.Projection.Combine(
        Builders<Model>.Projection.Include(x => x._id),
        Builders<Model>.Projection.Include(x => x.ParentId)
    );

var result = Col.Find(filter).Project(project).ToList();

В качестве альтернативы вы можете использовать синтаксис LINQ, который будет переведен в соответствующийКоманда MongoDB:

var values = new[] { "PO", "role1", "TO" };

var q = from doc in Col.AsQueryable()
        where doc.Roles.Any(x => values.Contains(x.Name))
        select new Model6()
        {
            ParentId = doc.ParentId,
            _id = doc._id
        };

var result = q.ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...