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

时间:2017-08-15 11:22:39

标签: mongodb aggregation-framework

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

{
    "participantIdentities": [
        {
            "player": {
                "summonerName": "Summ1",
                "otherData": "Whatever"
            },
            "participantId": 1
        },
        {
            "player": {
                "summonerName": "Summ2",
                "otherData": "Whatever2"
            },
            "participantId": 2
        }
    ]
}

我正在尝试返回其中一个元素的索引,因此我可以将其传递给管道的下一部分,但它会抛出错误。

代码:

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

错误:

"ok" : 0,
"errmsg" : "Unrecognized expression '$participantIdentities.player.summonerName'",
"code" : 168,
"codeName" : "InvalidPipelineOperator"

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

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

1 个答案:

答案 0 :(得分:4)

如果你look at the usage它实际上告诉你。那个"阵列"是第一个参数,第二个参数是"搜索表达式" 必须为等式检查生成一个值。

所以不要将表达式写入"测试元素相等"你代替"指向数组中的元素来测试"。这意味着注明 "use strict"; const process = require('./library/process') const fs = require('async-file') module.exports = class install { async setup (ctx, next) { ctx.body = 'install'; } } ,以便简单地将"$participantIdentities.player.summonerName"属性作为转换数组进行测试:

"name"

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

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

或者,如果您愿意,可以使用.map()indexOf()

将上述内容与JavaScript等效习语一起考虑
[ "Summ1", "Summ2" ]

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

participantIdentities.map( p => p.player.summonerName ).indexOf("Summ2")

基本上是"简写"使用MongoDB的$map运算符。

然后相比之下,因为&#34;第二个指数&#34; <{1}}或"$participantIdentities.player.summonerName" 匹配,然后返回该值。