リストの要素が常にアップサートされた値の結合になるように、リストを含むドキュメントをアップサートする方法があるかどうかを判断しようとしています。
次のクラスがあるとします (物事を単純化するために構成されています)。
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
}
さらに、最近読んだ本だけの更新を取得すると仮定しますが、読んだすべての本の完全なリストを DB に保持したいと考えています。したがって、私がやりたいのは、存在しない場合は Patron (booksRead を使用) を挿入するか、Patron が既に存在する場合は booksRead を更新することです。
したがって、最初の 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 本を渡そうとしますが、「Of Mice and Men」だけを読み取りリストに挿入して、ドキュメントが次のようになるようにしたいと思います。
"_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 は最初のロード (挿入) で機能しますが、2 回目の更新で完全なリストを置き換えます。$addToSet は更新時に機能しますが、最初の挿入時に「非配列」に挿入しようとすると不平を言います。
アップデート:
これは、Spring-mongodb の問題のようです。mongo Java api 呼び出しで上記を実現できますが、同等のスプリングを使用すると失敗します。(少なくとも spring-data-mongodb 1.6.2 まで)