Documents.update(
{_id: Session.get("current_document_id")},
{$push: {schema: {type: "text", size: size, name: name, label: label}}}
);
以上查询是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"}
我想使用此查询修改子文档的名称和大小属性:
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"}
答案 0 :(得分: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"}}}
);
这会将匹配的schema
元素替换为$set
对象中包含的元素。
如果您只想更新目标schema
元素的各个字段,则可以使用点表示法。例如,仅更新size
和name
字段:
Documents.update(
{_id: Session.get("current_document_id"), 'schema.name': "first_name"},
{$set: {'schema.$.size': 7, 'schema.$.name': name}}
);
答案 1 :(得分:0)
您可以使用带有位置 $[] 运算符的 arrayFilters
以下来自 mongodb 官方文档的示例使用“elem”作为位置标识符
考虑一个包含以下文档的集合 student2:
{
"_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 } } ]
}
)