9
Documents.update(
  {_id: Session.get("current_document_id")}, 
  {$push: {schema: {type: "text", size: size, name: name, label: label}}}
);

上面的查询是一个 Meteor 集合,'Documents.update' 映射到 MongoDB 文档 (http://docs.mongodb.org/manual/applications/update/) 中的 'db.documents.update'。通过该查询,我可以在主文档中添加架构文档。子文档存储在一个数组中:

Document:
  schema:
    array:
      {type: "text", size: 6, name: "first_name", label: "First name"},
      {type: "text", size: 6, name: "last_name", label: "Last name"}

我想用这个查询修改子文档的名称和大小属性:

Documents.update(
  {_id: Session.get("current_document_id"), 'schema' : "first_name"}, 
  {$push: {schema: {type: "text", size: 7, name: name, label: "First Name2"}}}
);

但是该操作直接在模式下附加一个新对象并删除数组:

Document:
  schema:
      {type: "text", size: 7, name: "first_name", label: "First Name2"}

如何修改查询以更改属性以避免此问题?查询后我想要这个文件:

Document:
  schema:
    array:
      {type: "text", size: 7, name: "first_name", label: "First name2"},
      {type: "text", size: 6, name: "last_name", label: "Last name"}
4

2 回答 2

22

$set您可以使用使用$位置运算符来识别选择器中匹配的数组元素的操作来更新现有数组元素,如下所示:

Documents.update(
  {_id: Session.get("current_document_id"), 'schema.name': "first_name"}, 
  {$set: {'schema.$': {type: "text", size: 7, name: name, label: "First Name2"}}}
);

这会将匹配的元素替换为对象schema中包含的元素。$set

如果您只想更新目标schema元素的各个字段,可以使用点表示法。例如,仅更新sizeandname字段:

Documents.update(
  {_id: Session.get("current_document_id"), 'schema.name': "first_name"}, 
  {$set: {'schema.$.size': 7, 'schema.$.name': name}}
);
于 2012-12-08T16:48:02.210 回答
1

您可以将 arrayFilters 与位置 $[] 运算符一起使用

以下来自官方 mongodb 文档的示例使用“elem”作为位置标识符


考虑一个包含以下文档的学生集合:

{
   "_id" : 1,
   "grades" : [
      { "grade" : 80, "mean" : 75, "std" : 6 },
      { "grade" : 85, "mean" : 90, "std" : 4 },
      { "grade" : 85, "mean" : 85, "std" : 6 }
   ]
}
{
   "_id" : 2,
   "grades" : [
      { "grade" : 90, "mean" : 75, "std" : 6 },
      { "grade" : 87, "mean" : 90, "std" : 3 },
      { "grade" : 85, "mean" : 85, "std" : 4 }
   ]
}

要修改等级数组中等级大于或等于 85 的所有元素的均值字段的值,请使用位置 $[] 运算符和 arrayFilters:

db.students2.update(
   { },
   { $set: { "grades.$[elem].mean" : 100 } },
   {
     multi: true,
     arrayFilters: [ { "elem.grade": { $gte: 85 } } ]
   }
)
于 2021-03-20T16:29:56.200 回答