2013-12-03 4 views
1

У меня есть коллекция, которая выглядит как:Можно ли сделать это действие mongoDB более эффективным?

[ 
    { 
    'job': builder, 
    'name': bob 
    }, 
    { 
    'job': doctor, 
    'name': bob 
    }, 
    { 
    'job': builder, 
    'name': james 
    }, 
    { 
    'job': lawyer, 
    'name': james 
    }, 
    ... 
] 

У меня есть массив, где работа всегда такой же, как:

[ 
    { 
    'job': builder, 
    'name': jack 
    }, 
    { 
    'job': builder, 
    'name': john 
    }, 
    ... 
] 

Я хочу, чтобы заменить все объекты в моей коллекции, где работа строитель. Для этого в настоящее время я использую два отдельных запроса.

mycollection.remove({'job': builder}) 
mycollection.insert(new_job_array); 

Есть ли способ объединить это в один запрос?

+0

Что вы хотите заменить? Конкретные согласованные изменения ко всем документам? – WiredPrairie

+0

@WiredPrairie Я хочу заменить их всем новым массивом. Пример, возможно, нелогичен, но цель состоит в том, чтобы создать совершенно новый набор данных. –

+1

ОК - они должны быть выполнены в виде отдельных шагов. Нет никакой особой выгоды для этого, поскольку одна операция действительно дала характер изменений, которые вы делаете (кроме того, чтобы избежать второго сетевого запроса, который в большой схеме вещей был бы «шумом» в общем процессе). – WiredPrairie

ответ

0

Вы можете использовать команду update.

mycollection.update({'job':'builder'}, {new document}, {multi:true})

Более подробная информация здесь: MongoDB update

+0

Вы не можете обновить несколько документов, если второй параметр не содержит операторов обновления (например, '$ inc'). Таким образом, как описано, это не работает. – WiredPrairie

+0

@WiredPrairie Согласен, я пробовал это решение, и оно не решает проблему, как описано. –

0

Конечным результатом является то, что нет, не одна операция, которая делает это. Требуется 2 шага, и он должен действительно использовать обратный вызов.

mycollection.remove({'job': builder}, function(err){ 
    if (err) handle(); 
    else mycollection.insert(new_job_array); 
}); 
Смежные вопросы