我有一堆文档,每个文档都包含一个类似于以下内容的数组:
{
_id: 4,
grades: [
{ grade: 80, mean: 75, std: 8 },
{ grade: 85, mean: 90, std: 5 },
{ grade: 90, mean: 85, std: 3 }
]
}
我希望更新具有相应std
的子文档的grade=85
字段。
如果我尝试在以下语句中使用Mango driver,我正在使用positional ($) operator并且其update
方法会抱怨或默默地忽略更新:
my $result = $self->collection->update({_id => 4, grades => {grade => 85}}, {'$set' => {'grades.$.std' => 6, 'grades.$.new_field' => 'test'}});
和
my $result = $self->collection->update($oid, {grades => {grade => 85}}, {'$set' => {'grades.$.std' => 6}});
并且无法正确更新子文档。不指定位置运算符时,Mango update
方法有效。此外,find_and_modify
并没有给我一个更好的结果。
当尝试使用$elemMatch
运算符时(虽然不需要,但我认为,因为我只有一个查询)我得到的内容是Write error at index 0: The dollar ($) prefixed field '$elemMatch' in 'grades.$elemMatch' is not valid for storage. at ...
我怎么能和芒果一起做这件事呢?
如果Mango的update
方法不支持此功能,MongoDB official Perl driver支持吗?
答案 0 :(得分:0)
positional ($) operator支持在使用MongoDB official Perl driver时进行更新。
以下内容将更新嵌入在特定文档中的数组的子文档中的字段:
my $oid = MongoDB::OID->new("...");
$self->collection->update(
{_id => $oid, 'grades.grade' => 85},
{'$set' => {'grade.$.new_field' => 'test'}}
);