我在集合中有以下记录:
{
id : id_value,
streams : [
{ a : a_value, b : b_value, c : c_value },
{ a : a_value, b : b_value, c : c_value }, ...
]
}
我希望能够更改流数组中特定条目的c_value。我一直在使用两步过程来执行此操作,从 streams 数组中提取一个条目,创建一个新条目并将其添加回 streams 数组。这有效,但似乎不是实现这一目标的最有效方法。有没有更好的方法可以使用?以下是我目前正在使用的代码:
db.users.update({id:user},
{$pull : {streams : {$and : [{a : a_value}, {b : b_value}]}}},
{w:1}, cb);
new_entry = { a : old_a_value, b : old_b_value, c : new_c_value}
db.users.update({id:user},
{$addToSet : {streams : new_entry}}, {w:1}, cb);
谢谢加里
如果数组记录中匹配多个字段,则需要$elemMatch字段。
当只匹配数组记录的一个字段时,下面工作:
db.users.update(
{ "id": user, "streams.a": a_value},
{ "$set" : { "streams.$.c": new_c_value } },
{ "w": 1}, cb);
当匹配数组记录的多个字段时,需要$elemMatch,如下所示:
db.users.update(
{ "id": user, streams: {$elemMatch : {a:a_value, b:b_value}},
{ "$set" : { "streams.$.c": new_c_value } },
{ "w": 1}, cb);