Возвращать результат как массив значений только - PullRequest
0 голосов
/ 04 июня 2018

У меня есть следующая коллекция

[ { _id: 5b12a7977990062f097d03ce,
    name: 'Breakfast',
    category: 'dining' },
  { _id: 5b12a7977990062f097d03d0,
    name: 'Brunch',
    category: 'dining' },
  { _id: 5b12a7977990062f097d03d2,
    name: 'Lunch',
    category: 'dining' } ]

Я должен собрать все name, имеющие category dining в основном массиве

Я пробовал это

       const subCategory = await SubCategory.aggregate([
          { '$match': { category: "dining" }},
          { '$group': {
            '_id': null,
            'category': { '$push': '$name' }
          }}
        ])

Но это дает мне вывод вот так

[ { _id: null,
    category: 
     [ 'Breakfast',
       'Brunch',
       'Lunch' ] } ]

И я хочу вывод вот так

     [ 'Breakfast',
       'Brunch',
       'Lunch' ]

Ответы [ 2 ]

0 голосов
/ 04 июня 2018
db.mycoll.aggregate(

    // Pipeline
    [
        // Stage 1
        {
            $match: {
                category: 'dining'
            }
        },

        // Stage 2
        {
            $group: {
                _id: null,
                category: {
                    $addToSet: '$name'
                }
            }
        },

        // Stage 3
        {
            $out: "temp"
        }

    ]

Набор результатов, полученный при выполнении вышеупомянутого совокупного запроса, будет сохранен во временную коллекцию temp

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

db.temp.distinct('name')
0 голосов
/ 04 июня 2018

Вы можете map().Используйте Array.map() с mongoose, поскольку он возвращает массив, и вам лучше просто использовать $group _id, чем использовать $push

const subCategory = (await SubCategory.aggregate([
  { '$match': { category: "dining" } },
  { '$group': { '_id': "$name" } }
])).map(({ _id }) => _id);

Или с Cursor.map() при использовании базового Collection из основного драйвера:

const subCategory = await SubCategory.collection.aggregate([
  { '$match': { category: "dining" } },
  { '$group': { '_id': "$name"  } }
]).map(({ _id }) => _id).toArray();

То же самое с find(), если вы используетене хотите «отличных» результатов:

const subCategory = (await Subcategory.find({ category: "dining" }))
  .map(({ name }) => name);

или с Cursor.map()

const subCategory = await Subcategory.collection.find({ category: "dining" })
  .map(({ name }) => name).toArray();

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

const subCategory = await SubCategory.distinct("name",{ category: "dining" });

сам MongoDBне вернет ничего, кроме документа BSON, и простая строка НЕ ​​является документом BSON.

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