0

我正在尝试确定是否有一种方法使用 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)

4

3 回答 3

0

Issue appears to be at Spring layer. While I get errors upserting using its FindAndModify command, I don't have a issue with $addToSet with the mongo DBCollection.findAndModify and DBCollection.update methods.

于 2015-04-20T14:33:32.907 回答
0

我认为您可以使用 addToSet 运算符来执行此操作。您可以在 MongoDB 的网站上找到文档:http: //docs.mongodb.org/manual/reference/operator/update/addToSet/#up._S_addToSet

它与 update() 或 findAndModify() 方法一起使用。

于 2015-04-20T13:21:05.293 回答
0

最简单的方法是删除旧条目,然后将其与添加的书籍一起重新添加。理想情况下,这应该以事务方式完成。

于 2015-04-20T13:17:12.150 回答