仅将结果作为值数组返回

时间:2018-06-04 06:01:00

标签: node.js mongodb mongoose mongodb-query aggregation-framework

我有以下收藏

[ { _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 :(得分:1)

你可以map()。将Array.map()与mongoose一起使用,因为它返回一个数组,你最好只使用$group _id而不是使用$push

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

如果使用核心驱动程序中的基础Collection,则使用Cursor.map()

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

find()大致相同,如果你不想要" distinct"结果:

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文档。

答案 1 :(得分:0)

location / {
   proxy_pass http://targetwebsite;
}

执行上述聚合查询时获得的结果集将存储到临时集合临时文件

进入下一阶段,我们可以执行以下操作以获得数组结果。

db.mycoll.aggregate(

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

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

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

    ]