如何插入包含列表的mongo(或spring-mongo)文档

时间:2015-04-20 13:07:08

标签: java mongodb upsert spring-mongo findandmodify

我正在尝试确定是否有使用spring-mongodb(或者甚至使用mongo java API)的方法来插入包含列表的文档,使得列表的元素始终是upserted值的并集。

假设我有以下类(用来简化事情):

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(带有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)

3 个答案:

答案 0 :(得分:0)

最简单的方法是删除旧条目,然后使用添加的书籍重新添加。理想情况下,这应该以交易方式完成。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

问题似乎出现在Spring层。虽然我使用其FindAndModify命令获取错误,但我没有使用mongo DBCollection.findAndModify和DBCollection.update方法的$ addToSet问题。