有没有办法在聚合管道中获取索引,我有一个来自长聚合查询的结果
[
{
"_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
的索引,而上面的数组中可以包含100个对象。
答案 0 :(得分:1)
根据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") } }
])
早期版本的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
或其他输出。