使用Mongotemplate的Mongodb $ slice运算符

时间:2016-01-29 07:08:27

标签: java mongodb spring-data mongotemplate

我的文件如下:

{
    "_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 
            }
        } 
    } 
);

但我不知道如何使用updateMongoTemplate$slice$each中撰写$push查询。

1 个答案:

答案 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);
        }
    }
}