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}。我究竟做错了什么?
如果您查看使用情况,它实际上会告诉您。“数组”是第一个参数,第二个参数是一个“搜索表达式”,它必须为相等检查生成一个值。
因此,与其将表达式写入“测试元素相等性”,不如“指向要测试的数组中的元素”。这意味着"$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-1或1是匹配,则该返回值。
| 归档时间: |
|
| 查看次数: |
3138 次 |
| 最近记录: |