我正在尝试确定是否有一种方法使用 spring-mongodb(甚至使用 mongo java API)来更新包含列表的文档,以便列表的元素始终是更新插入的值的联合。
假设我有以下类(为了简化事情而组成):
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) 如果它不存在或更新他们的 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 本书,但我只想在阅读列表中插入“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 适用于初始加载(插入),但会在第二次更新时替换完整列表。$addToSet 适用于更新,但抱怨尝试在初始插入时插入“非数组”。
更新:
这似乎是 Spring-mongodb 的问题。我可以通过 mongo java api 调用实现上述目标,但在使用 spring 等效项时它会失败。(至少到 spring-data-mongodb 1.6.2)