使用Mango的位置运算符更新MongoDB中文档数组中的子文档字段

时间:2015-07-30 20:16:59

标签: mongodb perl

我有一堆文档,每个文档都包含一个类似于以下内容的数组:

{
  _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支持吗?

1 个答案:

答案 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'}}
);