2016-11-25 25 views
0

我已经可以在mongoshell上执行所需的查询,但是我需要使用Java和MongoOperations进行相同的查询。使用MongoOperations删除Mongo上的多个阵列条目

我已经检查 this的问题,这是非常相似,但它只有一个条件,因为我的有两个,并使用$gte$lt运营商。这里的工作蒙戈查询:

db.getCollection('example').update({"idVar": "desiredValued"}, { $pull: { "listaHoras": { $gte: ISODate("2016-11-06T05:50:00.000Z"), $lt: ISODate("2016-11-06T06:30:00.000Z")}}}) 

样品DOC:

"_id" : ObjectId("58221b4610a3c71f1894ce75"), 
"idVar" : "56b11259272f5515b05d70bc", 
"date" : ISODate("2016-11-06T03:00:00.000Z"), 
"listaHoras" : [ 
    ISODate("2016-11-06T05:40:00.000Z"), 
    ISODate("2016-11-06T06:30:00.000Z"), 
    ISODate("2016-11-06T06:40:00.000Z") 
    ] 

我将在其中有ISODATE在Java中的Date变量,desiredValue作为一个字符串变量。

到目前为止,我有我做了以下,使用前面提到的问题为例:

BasicDBObject match = new BasicDBObject("idVar", desiredValue); // to match your document 
BasicDBObject update = new BasicDBObject("listaHoras", new BasicDBObject("itemID", "1")); 
coll.update(match, new BasicDBObject("$pull", update)); 

但是,正如你所看到的,这是不等同于所需的查询。由于$pull的匹配与“1”匹配"itemID"。我不知道,也找不到如何在相同的查询中正确使用$gte$lt。无论如何只使用其中的一个或两个。我知道它可以完成,如在 MongoOperatioons API上看到的那样:

“更新 - 包含更新对象或操作现有对象的$操作符的更新文档。

任何人都知道如何做到这一点?如果Java中的Date类型与Mongo中的ISODATE匹配,

+0

请添加示例文档进行测试。 – Veeram

+0

添加样例文档。 –

回答

1

我设法找到解决方案。这与Veeram发布的答案类似,但略有不同。我只是删除了他的updateCriteria,并在其中使用了一个BasicDBObject

下面是完整的代码看起来:

Query findQuery = new Query(); 
Criteria findCriteria = Criteria.where("idVar").is(idVar); 
findQuery.addCriteria(findCriteria); 
Update update = new Update().pull("listaHoras", new BasicDBObject("$gte", start).append("$lte", end)); 
mongoOps.updateMulti(findQuery, update, "CollectionName"); 

startend是由该方法收到日期变量。同样重要的是要注意,Mongo使用UTC作为默认时区,所以我们必须正确地格式化时间,以便删除所需的值。

1

你可以尝试下面的东西。这将从listaHoras数组中删除这两个项目。

Query findQuery = new Query(); 
    Criteria findCriteria = 
      Criteria.where("idVar").is("56b11259272f5515b05d70bc"); 
    findQuery.addCriteria(findCriteria); 

    LocalDate startDt = LocalDate.of(2016, 11, 6); 
    LocalTime startTm = LocalTime.of(5, 40, 0); 

    LocalDate endDt = LocalDate.of(2016, 11, 6); 
    LocalTime endTm = LocalTime.of(6, 35, 0); 


    Date start = Date.from(LocalDateTime.of(startDt, startTm).toInstant(ZoneOffset.UTC)); 
    Date end = Date.from(LocalDateTime.of(endDt, endTm).toInstant(ZoneOffset.UTC)); 

    Query updateQuery = new Query(); 
    Criteria updateCriteria = 
      Criteria.where(null).gte(start).lt(end); 
    updateQuery.addCriteria(updateCriteria); 
    mongoOperations.updateMulti(findQuery, update, "example"); 
+0

它运行但它不会删除记录。我会检查日期和ISODATE是否确实兼容,并做一些更多的测试,并用我发现的任何内容更新该帖子 –

+0

我更新了答案,以包含正确的更新评论。对不起,延迟。 – Veeram