У меня есть база данных 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();
}```