仅将结果作为值数组返回

Posted

技术标签:

【中文标题】仅将结果作为值数组返回【英文标题】: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' ]

【问题讨论】:

【参考方案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')

【讨论】:

以上是关于仅将结果作为值数组返回的主要内容,如果未能解决你的问题,请参考以下文章

XPATH - 获取返回的单个值而不是数组 php

返回年份数组作为年份范围

VueJs 仅将数组推入数组值

数组作为方法参数- 数组作为方法返回值

ResultSet 仅将最后一行返回到 JTable

请用c语言编写一个函数fun功能是:计算n门课程的平均分,计算结果作为函数值返回