Mongo通过ID在对象数组中找到位置

时间:2020-06-26 09:47:26

标签: arrays mongodb mongodb-query aggregation-framework

我有一系列文件

{
    _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以及如何在此处与聚合一起使用感到很困惑。

1 个答案:

答案 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" ]
            }
        }
    }
])

Mongo Playground