Запрос массива с несколькими значениями для получения определенного c значения в mongodb - PullRequest
0 голосов
/ 13 июля 2020

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

"name" : "Sam",
"date" : ISODate("2020-02-05T06:34:28.453Z"),
"technology" : [ 
    {
        "technologyId" : "1",
        "technologyName" : "tech1"
    }, 
    {
        "technologyId" : "2",
        "technologyName" : "tech2"
    }, 
    {
        "technologyId" : "3",
        "technologyName" : "tech3"
    }, 
    {
        "technologyId" : "4",
        "technologyName" : "tech4"
    }
],
"sector" : [ 
    {
        "sectorId" : "1",
        "sectorName" : "sector1"
    }, 
    {
        "sectorId" : "2",
        "sectorName" : "sector2"
    }, 
    {
        "sectorId" : "3",
        "sectorName" : "sector3"
    }, 
    {
        "sectorId" : "4",
        "sectorName" : "sector4"
    }
]

Это мой простой запрос

db.getCollection('myCollection').find({'name':'Sam'})

Есть ли способ получить все технологии для имени в одном запрос.

Мой вывод должен содержать только tech1,tech2,tech3,tech4.

Ответы [ 2 ]

1 голос
/ 13 июля 2020

Двухэтапное агрегирование с использованием $match, $project и $map.

Запрос:

db.collection.aggregate([
  {
    $match: {
      name: "Sam"
    }
  },
  {
    $project: {
      "name": "$name",
      "technologies": {
        $map: {
          input: "$technology",
          as: "t",
          in: "$$t.technologyName"
        }
      }
    }
  }
]);

Результат:

[
  {
    "_id": ObjectId("5a934e000102030405000000"),
    "name": "Sam",
    "technologies": [
      "tech1",
      "tech2",
      "tech3",
      "tech4"
    ]
  }
]

В случае, если вы не хотите, чтобы name в окончательной O / P удалил его со стадии проекта .

1 голос
/ 13 июля 2020

Я считаю, что у вас нет дублирующих технологий под одним именем. Вы можете проецировать только названия технологий, а затем сопоставить:

db.getCollection('myCollection')
.find({ name: 'Sam' }, { 'technology.technologyName': 1 })
.map(function(doc) { return doc['technology.technologyName'] })
...