如何从嵌入文档mongo db spring数据中排除已删除的记录

时间:2014-09-19 11:12:50

标签: spring mongodb spring-data-mongodb

我想只获取嵌入文档中未标记为已删除的邮件。例如 为我的收藏

{
   "users":[
            {
           "email":"user@company.com"            
            "messages":[
                        {
                          "text":"some message",
                          "isDeleted":"false"  
                        },{
                          "text":"some message",
                          "isDeleted":"false"  
                        },{
                          "text":"some message",
                          "isDeleted":"false"  
                        },{
                          "text":"some message",
                          "isDeleted":"true"  
                        },{
                          "text":"some message",
                          "isDeleted":"false"  
                        }

            ]            

            }
    ]  

}

所以结果应该是4条消息而不是5条。

我正在尝试这个

Query query = new Query();
query.addCriteria(Criteria.where("messages.isDeleted").is(false));
User user = mongoTemplate.findOne(query,User.class);

但是这不起作用,因为我的查询返回用户,当我收到用户消息时,它包含所有消息。

1 个答案:

答案 0 :(得分:0)

您需要使用$unwind运算符展开消息数组,然后使用$match运算符

应用条件
DBObject unwind = new BasicDBObject("$unwind", "$messages");
DBObject match = new BasicDBObject("$match", new BasicDBObject("messages.isDeleted", false));

AggregationOutput output = mongoTemplate.getCollection("user").aggregate(unwind, match);
List<Message> messages = new ArrayList<Message>();
Iterator<DBObject> iterator = output.results().iterator();
while(iterator.hasNext()) {
    DBObject obj = (DBObject) iterator.next();
    Message message = emrDataStore.getConverter().read(Message.class, (DBObject)obj.get("messages"));
    messages.add(message);
}

List<Message> messages将保留结果 - 未删除的消息