Обновление/удаление нескольких объектов с помощью Jongo

У меня есть метод, который принимает коллекцию объектов, которые необходимо удалить.

Вот так я их сейчас удаляю

public void deleteAll(Collection<Object> objs){
     for(Object obj : objs) {
       collection.remove("{ _id: # }", obj.getId());
     }
}

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

Есть ли лучший способ сделать обновление/удаление?


person hpkancha    schedule 05.06.2014    source источник
comment
Основная концепция, хотя я и не знаком с синтаксисом этой библиотеки, заключается в использовании оператора $in со списком. Поэтому, если вы можете каким-то образом отобразить все ваши значения _id в типе списка, вы сможете отправлять их в качестве аргумента с помощью этого оператора. Я вижу, что есть раздел о шаблонах запросов под примерами запросов на основном сайте, которые могут относиться к этому.   -  person Neil Lunn    schedule 05.06.2014
comment
Спасибо, Нил, это очень помогло с удалением. Однако с помощью обновлений я могу извлечь все документы, которые необходимо обновить, но я все еще не знаю, как сохранить все новые документы за один раз. Методы with() и save() Jongo принимают только 1 объект за раз и не принимают коллекцию объектов.   -  person hpkancha    schedule 06.06.2014
comment
Как я уже говорил ранее, у меня нет никакого опыта работы с Jongo, а также нехватки времени, чтобы опробовать некоторые примеры, но если у вас есть MongoDB 2.6 или более поздняя версия, тогда этот раздел руководства на Массовое обновление может представлять интерес. Я опубликовал несколько ответов об использовании, и у вас должен быть способ, по крайней мере, получить необработанный объект базы данных из драйвера Java, чтобы использовать требуемую версию runCommand этого. Или, возможно, другой API массового обновления, предоставляемый вашим драйвером Java, если это недавняя версия.   -  person Neil Lunn    schedule 06.06.2014


Ответы (1)


Можно как удалить, так и обновить несколько документов с помощью одного запроса.

удалить

Вам нужно использовать запрос с селектором, используя $in, и массив значений _id для сопоставления.

С Jongo вы можете создать список, соответствующий $in в запросе, несколькими способами.

// pass an array of ids
ObjectId[] ids = {id1, id2, id3};
collection.remove("{ _id: { $in: # } }", ids);

// or pass each id separately
collection.remove("{ _id: { $in:[#, #, #] }}", id1, id2, id3);

обновить

Точно такая же концепция, как и выше, с использованием $in для выбора объектов, которые вы хотите обновить, однако вы также должны установить multi опцию, чтобы обновление применялось ко всем документам, которые оно матчи против, а не только первый.

С Джонго это делается так

ObjectId[] ids = {id1, id2, id3};
collection
  .update("{ _id: { $in: # } }", ids)
  .multi()
  .with({ $set: { foo: "bar" });
person davnicwil    schedule 23.07.2015