如何使用 $indexOfArray 返回数组索引

Ash*_*ley 5 mongodb aggregation-framework

我在 Mongo 中有以下文档结构:

{
    "participantIdentities": [
        {
            "player": {
                "summonerName": "Summ1",
                "otherData": "Whatever"
            },
            "participantId": 1
        },
        {
            "player": {
                "summonerName": "Summ2",
                "otherData": "Whatever2"
            },
            "participantId": 2
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我试图返回其中一个元素的索引,这样我就可以将它传递给管道的下一部分,但它抛出了一个错误。

代码:

db.match.aggregate(
    [
        {
            "$project": {
                "matchedIndex": {
                    "$indexOfArray": [
                        "$participantIdentities", {"$player.summonerName": {$eq: "Summ2"}}
                    ]
                }
            }
        }
    ]
)
Run Code Online (Sandbox Code Playgroud)

错误:

"ok" : 0,
"errmsg" : "Unrecognized expression '$participantIdentities.player.summonerName'",
"code" : 168,
"codeName" : "InvalidPipelineOperator"
Run Code Online (Sandbox Code Playgroud)

我不确定我做错了什么,我不确定是否支持查询当前数组的元素,这可能是问题所在?

在上面的例子中,我希望它返回第二个元素的数组索引(其中summerName 是Summ2),即{"matchedIndex": 1}。我究竟做错了什么?

Nei*_*unn 7

如果您查看使用情况,它实际上会告诉您。“数组”是第一个参数,第二个参数是一个“搜索表达式”,它必须为相等检查生成一个值。

因此,与其将表达式写入“测试元素相等性”,不如“指向要测试的数组中的元素”。这意味着"$participantIdentities.player.summonerName"为了简单地测试"name"属性作为转换后的数组而进行标记:

db.match.aggregate([
 { "$project": {
   "matchedIndex": {
     "$indexOfArray": [
       "$participantIdentities.player.summonerName",
       "Summ2"
     ]
   }
 }}
])
Run Code Online (Sandbox Code Playgroud)

该符号基本上采用源数组并使其显示如下以进行比较:

[ "Summ1", "Summ2" ]
Run Code Online (Sandbox Code Playgroud)

或者,如果您愿意,可以将上述内容视为与 JavaScript 等效的习惯用法,使用.map()indexOf()

participantIdentities.map( p => p.player.summonerName ).indexOf("Summ2")
Run Code Online (Sandbox Code Playgroud)

从实践的角度来看,这是同一回事。所以即使

"$participantIdentities.player.summonerName"
Run Code Online (Sandbox Code Playgroud)

本质上是使用$mapMongoDB 运算符的“简写” 。

然后在比较,因为这是“第二索引”n-11是匹配,则该返回值。