Я пытаюсь определить, есть ли способ использовать spring-mongodb (или даже использовать API-интерфейс mongo java), чтобы обновить документ, содержащий список так что элементы списка всегда являются объединением значений, которые были сохранены.Как обновить документ mongo (или spring-mongo), содержащий список
Пусть у меня есть следующие классы (составленные упрощать вещи):
public class Patron {
private String name;
private String address;
private List<Book> booksRead;
// assume gets/sets
}
public class Book{
private String title;
private String author;
// assume gets/sets
}
Далее, давайте предположим, что я получаю обновления на только последние книги читать, но я хочу сохранить в БД в полной мере список всех прочитанных книг. Так что я хотел бы сделать, это вставить Patron (with booksRead), если он не существует или обновить их книги. Читайте, если Patron уже существует.
Итак, первый upsert «John Doe» не в сборе, поэтому документ вставляется и выглядит следующим образом:
"_id": ObjectId("553450062ef7b63435ec1f57"),
"name" : "John Doe"
"address" : "123 Oak st, Anytown, NY, 13760"
"booksRead" : [
{
"title" : "Grapes of Wrath",
"author" : "John Steinbeck"
},
{
"title" : "Creatures Great and Small",
"author" : "James Herriot"
}
]
Джон перечитывает «Гроздья гнева», а также гласит: «О мышах и Мужчины'. При попытке вставки проходит 2 книги, книги читать, но я хотел бы только вставить «О мышах и людях» в список чтения, так что документ выглядит следующим образом:
"_id": ObjectId("553450062ef7b63435ec1f57"),
"name" : "John Doe"
"address" : "123 Oak st, Anytown, NY, 13760"
"booksRead" : [
{
"title" : "Grapes of Wrath",
"author" : "John Steinbeck"
},
{
"title" : "Creatures Great and Small",
"author" : "James Herriot"
},
{
"title" : "Of Mice and Men",
"author" : "John Steinbeck"
}
]
Все, что я пытался, кажется, указывает для того, чтобы отделить вызовы один для вставки и один для обновления. Update.set работает для начальной загрузки (вставка), но заменяет полный список второго обновления. $ addToSet работает над обновлением, но жалуется на попытку вставить в 'non-array' при начальной вставке.
UPDATE:
Это, как представляется, проблема с Спринг-MongoDB. Я могу достичь вышеуказанного с помощью mongo java api calls, он просто терпит неудачу при использовании весенних эквивалентов. (по крайней мере, до spring-data-mongodb 1.6.2)
Да, проблема в том, что монго не поддерживает транзакции, вам нужно управлять этим самостоятельно. Поэтому, прежде чем я создам целую многофазную схему commint с блокировкой, я пытаюсь понять, могу ли я использовать возможности upsert mongo –