【问题标题】:Mongodb $slice operator with MongotemplateMongodb $slice 运算符与 Mongotemplate
【发布时间】:2016-01-29 07:08:26
【问题描述】:

我的文件如下:

{
    "_id" : ObjectId("53b246aae4b0ad1d6b6a5c02"),        
    "name" : "PATHOLOGY",     
    "status" : true,
    "history" : [ 
        {
            "updateBy" : "53bcc05a48d1665cd8692993",            
            "date" : ISODate("2014-12-20T10:19:07.246Z")
        }
    ]
}

我想在history key 中保留最近 5 个历史记录:

所以我可以为此编写以下查询:

db.collection.update( 
    { "_id" : ObjectId("53b246aae4b0ad1d6b6a5c02") },
    { $push : { 
        history : 
            {
              $each : [ 
                     {
                        "updateBy" : "53bcc05a48d1665cd8692993",                      
                        "date" : new Date()
                     }
                ] , 
              $slice : -5 
            }
        } 
    } 
);

但我不知道如何用$slice$each$pushMongoTemplate 中编写update 查询。

【问题讨论】:

  • $slice 尚不支持 spring-data-mongodb 中的 Update。请为DATAMONGO-832投票。

标签: java mongodb spring-data mongotemplate


【解决方案1】:

正如@ChristophStrobl 在他们的评论中指出的那样

$slice 尚不支持 spring-data-mongodb 中的更新。请 投票给DATAMONGO-832

您需要设计一种解决方法,利用 mongoTemplate 的 executeCommand 方法,通过 findAndModify 命令提供 json 字符串:

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

【讨论】:

  • 感谢您的回答,但我已经在使用 Update update = new Update(); update.push("history", new BasicDBObject("$each", list).append("$slice", -5));
  • 我只是想知道spring-data中是否有对$slice的内置支持
  • @HarshPatel 不幸的是没有。要在以后的版本中添加此支持,您可能需要投票here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-02
  • 2018-07-24
  • 1970-01-01
  • 2021-10-27
  • 2017-05-21
  • 1970-01-01
  • 2019-11-02
相关资源
最近更新 更多