MongoDB (Java): эффективное обновление нескольких документов до разных (!) Значений - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть база данных MongoDB, и программа, которую я пишу, предназначена для изменения значений одного поля для всех документов в коллекции. Теперь, если я хочу, чтобы все они изменились на одно значение, например, строковое значение «mask», тогда я знаю, что updateMany помогает, и это довольно эффективно.

Однако мне нужно эффективное решение для обновления до различных новых значений, фактически я хочу выбрать новое значение для рассматриваемого поля для каждого документа из списка, например ArrayList. Но тогда что-то вроде этого

collection.updateMany(new BasicDBObject(), 
new BasicDBObject("$set",new BasicDBObject(fieldName, 
       listOfMasks.get(random.nextInt(size)))));

не будет работать, поскольку updateMany не пересчитывает значение, которое должно быть установлено в поле, оно просто вычисляет аргумент

listOfMasks.get(random.nextInt(size))

будет один раз, а затем он использует это для всех документов. Поэтому я не думаю, что есть решение этой проблемы, которое может использовать updateMany, поскольку оно просто недостаточно универсально.

Но мне было интересно, есть ли у кого-нибудь идеи по крайней мере сделать это быстрее, чем просто перебирать все документы и каждый раз делать updateOne, где он обновляется до нового значения из ArrayList (в случайном порядке но это только деталь) как ниже?

// Loop until the MongoCursor is empty (until the search is complete)
        try {
            while (cursor.hasNext()) {

                // Pick a random mask
                String mask = listOfMasks.get(random.nextInt(size));

                // Update this document
                collection.updateOne(cursor.next(), Updates.set("test_field", mask));

            }
        } finally {
            cursor.close();
        }```

1 Ответ

0 голосов
/ 06 апреля 2020

MongoDB предоставляет API для массовой записи для пакетных обновлений. Это подойдет для вашего примера установки значения поля в случайное значение (определяемое на клиенте) для каждого документа.

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

...