我的文件如下:
{
"_id" : ObjectId("53b246aae4b0ad1d6b6a5c02"),
"name" : "PATHOLOGY",
"status" : true,
"history" : [
{
"updateBy" : "53bcc05a48d1665cd8692993",
"date" : ISODate("2014-12-20T10:19:07.246Z")
}
]
}
我想在history
键中保留最近5个历史记录:
所以我可以写下面的查询:
db.collection.update(
{ "_id" : ObjectId("53b246aae4b0ad1d6b6a5c02") },
{ $push : {
history :
{
$each : [
{
"updateBy" : "53bcc05a48d1665cd8692993",
"date" : new Date()
}
] ,
$slice : -5
}
}
}
);
但我不知道如何使用update
,MongoTemplate
和$slice
在$each
中撰写$push
查询。
答案 0 :(得分:0)
正如@ChristophStrobl在评论中指出的那样
spring-data-mongodb中的Update尚不支持
$slice
。请 投票给DATAMONGO-832
您需要设计一个使用mongoTemplate的 executeCommand
方法的变通方法,为json字符串提供 findAndModify
命令:
public class FooRepositoryImpl implements FooRepositoryCustom {
@Autowired
protected MongoTemplate mongoTemplate;
public void pushHistory(String objectId, String userId) {
Date now = new Date();
BasicDBObject searchQuery = new BasicDBObject().append("id", objectId);
DBObject modifiedObject = new BasicDBObject();
List<DBObject> eachObjectList = new ArrayList<DBObject>();
DBObject object = new BasicDBObject().append("updateBy", userId);
object.append("date", now);
eachObjectList.add(object);
modifiedObject.put("$push",
new BasicDBObject().append("history",
new BasicDBObject().append("$each", eachObjectList)
).append("$slice", -3)
);
String json = "{ findAndModify: \"collectionName\", query: " + searchQuery.toString() + ", update: " + modifiedObject.toString();
try {
mongoTemplate.executeCommand(json);
} catch (Exception e) {
System.out.println(e);
}
}
}