更新MongoDB文档中包含的数组中包含的子文档

rta*_*oni 7 mongodb meteor

Documents.update(
  {_id: Session.get("current_document_id")}, 
  {$push: {schema: {type: "text", size: size, name: name, label: label}}}
);
Run Code Online (Sandbox Code Playgroud)

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

Document:
  schema:
    array:
      {type: "text", size: 6, name: "first_name", label: "First name"},
      {type: "text", size: 6, name: "last_name", label: "Last name"}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Document:
  schema:
      {type: "text", size: 7, name: "first_name", label: "First Name2"}
Run Code Online (Sandbox Code Playgroud)

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

Document:
  schema:
    array:
      {type: "text", size: 7, name: "first_name", label: "First name2"},
      {type: "text", size: 6, name: "last_name", label: "Last name"}
Run Code Online (Sandbox Code Playgroud)

Joh*_*yHK 20

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

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

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

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

Documents.update(
  {_id: Session.get("current_document_id"), 'schema.name': "first_name"}, 
  {$set: {'schema.$.size': 7, 'schema.$.name': name}}
);
Run Code Online (Sandbox Code Playgroud)

  • @aGit For Meteor,您需要将其置于服务器定义的方法中.见http://stackoverflow.com/questions/31796164/updating-item-in-array-with-unique-id (2认同)
  • @JohnnyHK很多.我已经解决了.但是这里描述的解决方案我不仅仅更新数组中对象的字段而是更新整个对象.如果有人想只更新对象的一个​​字段,则修饰符应该是这样的:var modifier = {$ set:{'schema.$.name':content}}; 再次,非常感谢您的回答! (2认同)