pymongo(版本4.3.3)在路径’grades.$[elem]’中未找到标识符’elem’的数组过滤器。

huangapple go评论62阅读模式
英文:

pymongo (v. 4.3.3) No array filter found for identifier 'elem' in path 'grades.$[elem]

问题

我一直得到一致的错误:在路径 'grades.$[elem].std' 中找不到标识符 'elem' 的数组过滤器。

关于Mongo文档中的示例代码,请参考:https://www.mongodb.com/docs/manual/reference/operator/update/positional-filtered/

插入文档的代码如下:

db.students.insert_many( [
   {
      "_id" : 1,
      "grades" : [
         { "grade" : 80, "mean" : 75, "std" : 6 },
         { "grade" : 85, "mean" : 100, "std" : 4 },
         { "grade" : 85, "mean" : 100, "std" : 6 }
      ]
   },
   {
      "_id" : 2,
      "grades" : [
         { "grade" : 90, "mean" : 100, "std" : 6 },
         { "grade" : 87, "mean" : 100, "std" : 3 },
         { "grade" : 85, "mean" : 100, "std" : 4 }
      ]
   }
] )

查询代码如下:

cursor = db.students.update_many(
    filter={ },
    update={
        '$inc': {"grades.$[elem].std": -1},
        'arrayFilters': [{"elem.grade": {'$gte': 80}, "elem.std": {'$gt': 5}}],
    },
    upsert=True
)

一致出现的错误如下:

pymongo.errors.WriteError: 在路径 'grades.$[elem].std' 中找不到标识符 'elem' 的数组过滤器。
英文:

I am getting consistent error: No array filter found for identifier 'elem' in path 'grades.$[elem]
for sample code in Mongo Document: https://www.mongodb.com/docs/manual/reference/operator/update/positional-filtered/

db.students.insert_many( [
   {
      "_id" : 1,
      "grades" : [
         { "grade" : 80, "mean" : 75, "std" : 6 },
         { "grade" : 85, "mean" : 100, "std" : 4 },
         { "grade" : 85, "mean" : 100, "std" : 6 }
      ]
   },
   {
      "_id" : 2,
      "grades" : [
         { "grade" : 90, "mean" : 100, "std" : 6 },
         { "grade" : 87, "mean" : 100, "std" : 3 },
         { "grade" : 85, "mean" : 100, "std" : 4 }
      ]
   }
] )

and the query:

cursor = db.students.update_many(
    filter={ },
    update={
        '$inc'        : {"grades.$[elem].std": -1},
        'arrayFilters': [{"elem.grade": {'$gte': 80}, "elem.std": {'$gt': 5}}],
    },
    upsert=True
)

and the consistent error I get:
pymongo.errors.WriteError: No array filter found for identifier 'elem' in path 'grades.$[elem].std'

答案1

得分: 0

正确的查询应如下所示:

db.students.update_many(
 {},
 {"$inc" : {"grades.$[elem].std" : -1}}, 
 array_filters=[{"elem.grade":{"$gte" : 80 }, "elem.std":{"$lte" :5} }]
)

解释:
考虑到通常的更新查询由三个部分组成:

  1. 匹配过滤查询部分
  2. 更新部分
  3. 选项部分

正确的array_filters位置不在更新部分内,而是在选项部分之后。

mongo playground

英文:

the corect query need to look as follow:

db.students.update_many(
 {},
 {"$inc" : {"grades.$[elem].std" : -1}}, 
 array_filters=[{"elem.grade":{"$gte" : 80 }, "elem.std":{"$lte" :5} }]
)

Explained:
Considering usual update query consist of 3x sections:

  1. filter matching query section
  2. update section
  3. options section

The correct position of array_filters is not inside the update section , but afterwards in the options section.

mongo playgraund

huangapple
  • 本文由 发表于 2023年5月28日 21:35:29
  • 转载请务必保留本文链接:https://go.coder-hub.com/76351765.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定