英文:
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} }]
)
解释:
考虑到通常的更新查询由三个部分组成:
- 匹配过滤查询部分
- 更新部分
- 选项部分
正确的array_filters位置不在更新部分内,而是在选项部分之后。
英文:
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:
- filter matching query section
- update section
- options section
The correct position of array_filters is not inside the update section , but afterwards in the options section.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论