仅将结果作为值数组返回
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
dining
的name
我试过了
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')
【讨论】:
以上是关于仅将结果作为值数组返回的主要内容,如果未能解决你的问题,请参考以下文章