2016-05-21 1 views
1

У меня есть следующие записи в коллекции:Как изменить одно поле в структуре, которая является частью массива в MongoDB используя Node.js

{ 
    id : id_value, 
    streams : [ 
     { a : a_value, b : b_value, c : c_value }, 
     { a : a_value, b : b_value, c : c_value }, ... 
    ] 
} 

Я хочу, чтобы иметь возможность изменить c_value определенной записи в потоках . Я использую двухэтапный процесс выполнения этого, вытаскивая запись из массива , создавая новую запись и добавляя ее обратно в потоки .. Это работает, но не кажется наиболее эффективным способом достижения этого. Есть ли лучший подход, который я могу использовать? Ниже приведен код, который я в настоящее время с помощью:

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); 

Спасибо, Gary

ответ

1

Если более чем одно поле, совпадающим в записи массива, а затем $ требуется 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);