我在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}。我做错了什么?
答案 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"
]
}
}}
])
将上述内容与JavaScript等效习语一起考虑
[ "Summ1", "Summ2" ]
从实际角度来看,这是一回事。所以即使
participantIdentities.map( p => p.player.summonerName ).indexOf("Summ2")
基本上是"简写"使用MongoDB的$map
运算符。
然后相比之下,因为&#34;第二个指数&#34; <{1}}或"$participantIdentities.player.summonerName"
匹配,然后返回该值。