Как проецировать одно поле массива

начиная с этой схемы документа

{ 
    "_id" : ObjectId("5a5cfde58c8a4a35a89726b4"), 
    "Names" : [ 
                { "Code" : "en", "Name" : "ITALY" }, 
                { "Code" : "it", "Name" : "ITALIA" } 
              ],
    "TenantID" : ObjectId("5a5cfde58c8a4a35a89726b2"),
    ...extra irrelevant fields
}

Мне нужно получить такой объект

{ 
    "ID" : ObjectId("5a5cfde58c8a4a35a89726b4"), 
    "Name" : "ITALY"
}

Фильтрация по полю Code массива (в примере по 'en').

Я написал агрегированный запрос, это

db.Countries.aggregate([{$project: {_id:0, 'ID': '$_id', 'Names': {$filter: {input: '$Names', as: 'item', cond: {$eq: ['$$item.Code', 'en']}}}}},{$skip: 10},{$limit: 5}]);

которые правильно возвращают только документы со значениями «en» Name, возвращая только соответствующие элементы подмассива.

введите здесь описание изображения

Теперь я не могу найти способ вернуть только значение поля «Имя» в новое поле «Имя». Какой самый лучший и эффективный способ сделать это?

На самом деле я пытаюсь использовать оболочку Mongo, но позже мне нужно воспроизвести это поведение с помощью драйвера .NET.

Использование MongoDB 3.6

Спасибо


person Luca    schedule 16.01.2018    source источник


Ответы (1)


Вы можете попробовать запрос агрегации ниже.

$match, чтобы рассматривать только те документы, в которых хотя бы один элемент массива соответствует входным критериям.

$filter для входных критериев и $arrayElemAt для проецирования одного соответствующего элемента.

$let для вывода имени из соответствующего объекта.

db.Countries.aggregate([
  {"$match":{"Names.Code":"en"}},
  {"$project":{
    "_id":0, 
    "ID": "$_id",
    "Name":{
      "$let":{
        "vars":{
          "obj":{
            "$arrayElemAt":[
              {"$filter":{
                "input":"$Names",
                "as":"name",
                "cond":{"$eq":["$$name.Code","en"]}
              }},
              0]
          }
        },
        "in":"$$obj.Name"
      }
    }
  }},
 {"$skip": 10},
 {"$limit": 5}
])
person s7vr    schedule 16.01.2018