2016-01-29 1 views
2

Мой документ, как показано ниже:

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

Я хочу, чтобы сохранить последние 5 историй в history ключе:

так что я могу написать следующий запрос для этого:

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

Но я не знаю, как написать update запрос в MongoTemplate с $slice, $each и $push.

+1

'$ slice' не но поддерживается «Update» в spring-data-mongodb. Пожалуйста, проголосуйте за [DATAMONGO-832] (https://jira.spring.io/browse/DATAMONGO-832). –

ответ

0

Как @ChristophStrobl отметил в своем комментарии

$slice пока не поддерживается обновление пружинного-данных MongoDB. Пожалуйста, голосовать за DATAMONGO-832

Вы должны были бы разработать обходной путь, который использует executeCommand метода, mongoTemplate, обеспечивая строку 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); 
     } 
    } 
} 
+0

спасибо за ваш ответ, но я уже делаю то же самое с помощью 'Update update = new Update(); update.push ("history", новый BasicDBObject ("$ each", list) .append ("$ slice", -5)); \t ' –

+0

Я просто хочу знать, есть ли встроенная поддержка' $ slice' в 'spring-data' –

+0

@HarshPatel К сожалению, нет. Чтобы добавить эту поддержку в более поздние версии, вы можете проголосовать за нее [** здесь **] (https://jira.spring.io/browse/DATAMONGO-832). – chridam

 Смежные вопросы

  • Нет связанных вопросов^_^