gpt4 book ai didi

javascript - 使用聚合查找数组中对象的索引

转载 作者:可可西里 更新时间:2023-11-01 10:40:12 25 4
gpt4 key购买 nike

有没有办法在聚合管道中获取索引,我有一个长聚合查询的结果

[
{
"_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 多个对象。

最佳答案

根据可用的 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")
]
}
}}
])

$unwindincludeArrayIndex - MongoDB 3.2

回到releases中的一个版本,你可以通过$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或其他输出。

关于javascript - 使用聚合查找数组中对象的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47261856/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com