【问题标题】:Return result as an Array of Values Only仅将结果作为值数组返回
【发布时间】:2018-11-13 09:53:53
【问题描述】:

我有以下收藏

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

我必须在主数组中收集所有具有category diningname

我试过了

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

但它给了我这样的输出

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

我想要这样的输出

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

【问题讨论】:

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


    【解决方案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() 大致相同:

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

    【讨论】:

      【解决方案2】:
      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')
      

      【讨论】:

        猜你喜欢
        • 2017-03-09
        • 1970-01-01
        • 2015-08-26
        • 2017-02-17
        • 1970-01-01
        • 2014-07-23
        • 2011-06-22
        • 2015-05-20
        相关资源
        最近更新 更多