我有一系列文件
{
_id: ObjectId("5e388da4df54cb8efb47e61b"),
userId:'test_user'
productId:'product_6_id'
recommendations:{
_id:123
rankedList:[
0:{id:ObjectId('product_5_id'),Name:'Product_5'},
1:{id:ObjectId('product_6_id'),Name:'Product_6'},
2:{id:ObjectId('product_3_id'),Name:'Product_3'}],
Date:'2020-02-25T05:03:55.439+00:00'
}
},
{
_id: ObjectId("5e388da4df54cb8efb47e62b"),
userId:'test_user1'
productId:'product_3_id'
recommendations:{
_id:123
rankedList:[
0:{id:ObjectId('product_1_id'),Name:'Product_1'},
1:{id:ObjectId('product_5_id'),Name:'Product_5'},
2:{id:ObjectId('product_3_id'),Name:'Product_3'}],
Date:'2020-02-25T05:03:55.439+00:00'
}
}
,我每次都需要找到productId
在对象rankedList
数组中的位置。
因此,对于第一个文档,答案为 positionIndex = 1 ,对于第二个文档,答案为 positionIndex = 2 。
我对$indexOfArray
以及如何在此处与聚合一起使用感到很困惑。
答案 0 :(得分:1)
是的,您需要$indexOfArray。棘手的部分是recommendations.rankedList
是对象数组,但是MongoDB允许您使用以下表达式:
$recommendations.rankedList.id
其结果为字符串列表,在这种情况下为['product_5_id', 'product_6_id', 'product_3_id']
,因此您的代码如下所示:
db.collection.aggregate([
{
$project: {
index: {
$indexOfArray: [ "$recommendations.rankedList.id", "$productId" ]
}
}
}
])