gpt4 book ai didi

java - 使用 MongoOperations 删除 Mongo 上的多个数组条目

转载 作者:行者123 更新时间:2023-12-01 21:13:06 26 4
gpt4 key购买 nike

我已经可以在 mongoshell 上执行所需的查询,但我需要使用 Java 和 MongoOperations 进行相同的查询。

我查过 this问题,非常相似,但它只有一个条件,因为我的有两个条件并使用 $gte$lt 运算符。这是工作的 mongo 查询:

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

示例文档:

"_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 的匹配是将 "itemID" 与“1”匹配。我不知道,也无法找到如何在同一查询上正确使用 $gte$lt 。也不讨论如何使用其中之一或两者。我知道这可以完成,如 MongoOperatioons API 上所示。其中说:

“更新 - 包含更新的对象或用于操作现有对象的 $ 运算符的更新文档。”

有人知道如何做到吗?如果 Java 中的 Date 类型与 Mongo 上的 ISODATE 匹配呢?

最佳答案

我设法找到了解决方案。它与 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 作为默认时区,因此我们必须正确格式化时间,以便它删除所需的值。

关于java - 使用 MongoOperations 删除 Mongo 上的多个数组条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40806069/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com