有办法在聚合管道中获取索引吗,我有一个长aggreagte查询的结果
[
{
"_id": "59ed949227ec482044b2671e",
"points": 300,
"fan_detail": [
{
"_id": "59ed949227ec482044b2671e",
"name": "mila ",
"email": "mila@gmail.com ",
"password": "$2a$10$J0.KfwVnZkaimxj/BiqGW.D40qXhvrDA952VV8x.xdefjNADaxnSW",
"username": "mila 0321",
"updated_at": "2017-10-23T07:04:50.004Z",
"created_at": "2017-10-23T07:04:50.004Z",
"celebrity_request_status": 0,
"push_notification": [],
"fan_array": [],
"fanLength": 0,
"celeb_bio": null,
"is_admin": 0,
"is_blocked": 2,
"notification_setting": [
1,
2,
3,
4,
5,
6,
7
],
"total_stars": 0,
"total_points": 134800,
"user_type": 2,
"poster_pic": null,
"profile_pic": "1508742289662.jpg",
"facebook_id": "alistnvU79vcc81PLW9o",
"is_user_active": 1,
"is_username_selected": "false",
"__v": 0
}
]
}
],
所以我想在聚合查询中找到
_id
的索引,上面的数组可以包含100s个对象。 最佳答案
根据MongoDB的可用版本,有不同的方法:$indexOfArray
-MongoDB 3.4版
最好的接线员就是$indexOfArray
你有空的地方。这个名字说明了这一切:
Model.aggregate([
{ "$match": { "fan_detail._id": mongoose.Types.ObjectId("59ed949227ec482044b2671e") } },
{ "$addFields": {
"fanIndex": {
"$indexOfArray": [
"$fan_detail._id",
mongoose.Types.ObjectId("59ed949227ec482044b2671e")
]
}
}}
])
$unwind
使用includeArrayIndex
-MongoDB 3.2回到发行版中的一个版本,您可以从
$unwind
语法的数组中获取索引。但这确实需要$unwind
数组:Model.aggregate([
{ "$match": { "fan_detail._id": mongoose.Types.ObjectId("59ed949227ec482044b2671e") } },
{ "$unwind": { "path": "$fan_detail", "includeArrayIndex": true } },
{ "$match": { "fan_detail._id": mongoose.Types.ObjectId("59ed949227ec482044b2671e") } }
])
MapReduce-早期版本
MongoDB到3.2的早期版本无法在聚合管道中返回数组索引。因此,如果您想要匹配的索引而不是所有的数据,那么您可以使用
mapReduce
来代替:Model.mapReduce({
map: function() {
emit(
this._id,
this['fan_detail']
.map( f => f._id.valueOf() )
.indexOf("59ed949227ec482044b2671e")
)
},
reduce: function() {},
query: { "fan_detail._id": mongoose.Types.ObjectId("59ed949227ec482044b2671e") }
})
在所有情况下,我们基本上都是预先“查询”数组中“某处”元素的存在。“indexof”变量将返回
-1
,否则将找不到其他变量。这里也有
$addFields
的例子。如果您的真正意图是不返回100个项目的数组,那么您可能使用$project
或其他输出。