我正在尝试确定是否有一种方法可以使用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
}此外,假设我只获得了最近阅读的图书的更新,但我希望在数据库中保留所有已读图书的完整列表。所以我想做的是插入一个赞助人(与booksRead),如果它不存在或更新他们的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"
}
]约翰重读了“愤怒的葡萄”,也读了“人鼠情缘”。尝试插入两本书作为图书已读,但我只想在已读列表中插入“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)
发布于 2015-04-20 21:17:12
最简单的方法是删除旧条目,然后用添加的书籍重新添加它。理想情况下,这应该以事务方式完成。
发布于 2015-04-20 21:21:05
我认为您可以使用addToSet运算符来完成此操作。您可以在MongoDB的网站上找到文档:http://docs.mongodb.org/manual/reference/operator/update/addToSet/#up._S_addToSet
它与update()或findAndModify()方法一起使用。
发布于 2015-04-20 22:33:33
问题似乎出在Spring layer。虽然我在使用FindAndModify命令插入时遇到了错误,但使用$addToSet的mongo DBCollection.findAndModify和DBCollection.update方法并没有问题。
https://stackoverflow.com/questions/29748764
复制相似问题