MongoDb находит для возврата массив значений поля для заданного условия - PullRequest
1 голос
/ 14 марта 2020

Предположим, у меня есть коллекция, которая может быть чем-то вроде

{
  name: "ticktock",
  age: 102,
  residence : {
    street : "123 Main Street",
    city: "Gotham"
  }
}

, и я создаю запрос, который возвращает мне поле 'city'. Что-то вроде

db.people.find({age: {$gt: 50}, {residence.city: 1, _id:0}).toArray();

это вернуло бы мне массив, элементы которого выглядят как

{"residence" : {"city": "Gotham"}}

Теперь, если бы я хотел получить массив только значений. Пример: - ["Gotham", "Metropolis", "Minas Tirith"], Как я могу go об этом преобразовании?

Ответы [ 2 ]

2 голосов
/ 14 марта 2020

Это очень похоже на javascript, так что, возможно, Array.map:

db.people.find({age: {$gt: 50}, {residence.city: 1, _id:0}).toArray().map(d=>d.residence.city)
1 голос
/ 14 марта 2020

Обновление:

Для массива с дубликатами можно использовать агрегационный конвейер :

db.collection.aggregate([
  { $match: { age: { $gt: 50 } } },
  { $group: { _id: "", city: { $push: "$residence.city" } } }, // Use $addToSet for unique cities
  { $project: { city: 1, _id: 0 } }
]);

Тест: MongoDB-Playground

Старый:

Вы можете воспользоваться .distinct () , который способ получить уникальные значения для данного поля в виде массива. Давайте рассмотрим этот пример:

Сбор данных:

/* 1 */
{
    "_id" : ObjectId("5e6c2331d6be1c3d27afaecb"),
    "name" : "ticktock",
    "age" : 102.0,
    "residence" : {
        "street" : "123 Main Street",
        "city" : "Gotham"
    }
}

/* 2 */
{
    "_id" : ObjectId("5e6c2331d6be1c3d27afae22"),
    "name" : "ticktock2",
    "age" : 99.0,
    "residence" : {
        "street" : "123 Main Street",
        "city" : "Gotham"
    }
}

/* 3 */
{
    "_id" : ObjectId("5e6c2331d6be1c3d27afaecc"),
    "name" : "ticktock3",
    "age" : 102.0,
    "residence" : {
        "street" : "123 Main Street",
        "city" : "Metropolis"
    }
}

/* 4 */
{
    "_id" : ObjectId("5e6c2331d6be1c3d27afaecd"),
    "name" : "ticktock4",
    "age" : 102.0,
    "residence" : {
        "street" : "123 Main Street",
        "city" : "Minas Tirith"
    }
}

/* 5 */
{
    "_id" : ObjectId("5e6c2331d6be1c3d27afaece"),
    "name" : "ticktock5",
    "age" : 10.0,
    "residence" : {
        "street" : "123 Main Street",
        "city" : "SomeCityLess-AGE"
    }
}

/* 6 */
{
    "_id" : ObjectId("5e6c2331d6be1c3d27afaecf"),
    "name" : "ticktock6",
    "age" : 50.0,
    "residence" : {
        "street" : "123 Main Street",
        "city" : "someCity-AGE=50"
    }
}

/* 7 */
{
    "_id" : ObjectId("5e6c2331d6be1c3d27afaed0"),
    "name" : "ticktock7",
    "age" : 102.0,
    "residence" : {
        "street" : "123 Main Street",
        "city" : "Metropolis"
    }
}

/* 8 */
{
    "_id" : ObjectId("5e6c2498c16b5679b4043d66"),
    "name" : "ticktock8",
    "residence" : {
        "street" : "123 Main Street",
        "city" : "city-No-AGE"
    }
}

Запрос:

db.collection.distinct('residence.city')

Результат : Получит массив уникальных значений для данного поля ' Residence.city '.

/* 1 */
[
    "Gotham",
    "Metropolis",
    "Minas Tirith",
    "SomeCityLess-AGE",
    "city-No-AGE",
    "someCity-AGE=50"
]

Итак, давайте представим ваше условие, age: {$gt: 50}:

Запрос:

db.collection.distinct('residence.city',{age: {$gt:50}})

Результат: Итак, теперь у него есть уникальные названия городов, соответствующие заданным критериям.

/* 1 */
[
    "Gotham",
    "Metropolis",
    "Minas Tirith"
]

Примечание: Как и остаток, как и любой другой запрос к базе данных, вам необходимо иметь правильные индексы для этих двух полей age & Residence. city ​​, если ваши запросы в большей степени направлены на age > 50, вы можете использовать частичный индекс в поле age , а не в качестве обычного индекса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...