Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用带ArrayFilter的过滤位置运算符应用更新_Java_Mongodb_Spring Data Mongodb_Mongo Java Driver - Fatal编程技术网

Java 如何使用带ArrayFilter的过滤位置运算符应用更新

Java 如何使用带ArrayFilter的过滤位置运算符应用更新,java,mongodb,spring-data-mongodb,mongo-java-driver,Java,Mongodb,Spring Data Mongodb,Mongo Java Driver,我在Mongodb 3.6上运行,mongo驱动程序3.4.3和spring数据mongo 1.5.10。下面是我的文件结构 { "_id": 12345, "_class": "com.example.ProductRates", "rates": [ { "productId": NumberInt(1234), "rate": 100.0, "rateCardId": NumberInt(1), "month": Numb

我在Mongodb 3.6上运行,mongo驱动程序3.4.3和spring数据mongo 1.5.10。下面是我的文件结构

{
  "_id": 12345,
  "_class": "com.example.ProductRates",
  "rates": [
    {
      "productId": NumberInt(1234),
      "rate": 100.0,
      "rateCardId": NumberInt(1),
      "month": NumberInt(201801)
    },
    {
      "productId": NumberInt(1234),
      "rate": 200.0,
      "rateCardId": NumberInt(1),
      "month": NumberInt(201802)
    },
    {
      "productId": NumberInt(1234),
      "rate": 400.0,
      "rateCardId": NumberInt(2),
      "month": NumberInt(201803)
    },
    {
      "productId": NumberInt(1235),
      "rate": 500.0,
      "rateCardId": NumberInt(1),
      "month": NumberInt(201801)
    },
    {
      "productId": NumberInt(1235),
      "rate": 234,
      "rateCardId": NumberInt(2),
      "month": NumberInt(201803)
    }
  ]
}
我正在尝试对数据进行批量更新,如下所示

db.rates.update(
  { "_id" : 1234 },
  { $set: { "rates.$[item].rate": 200  } },
  { multi: true, 
   arrayFilters: [ { "item.rateCardId": {$in: [ 1, 2]} } ]
  }
)
现在,我们正在尝试将此代码转换为java。下面是我能够为批量更新案例实现的代码。正如预期的那样,由于使用了$[],下面的查询正在更新所有文档。我试图弄清楚如何在这里使用位置数组更新操作符(如$[one])应用数组过滤器

此外,我也找不到足够的教程或文档来说明如何在Java中应用所有复杂的mongo查询。请建议是否有我可以参考的好书或教程。

应该是:

WriteResult wr = getMongoTemplate().updateMulti(
  new Query(where("rates.rateCardId").is(1234)),
  new Update().set("rates.$[item].rate", 200),
  new UpdateOptions()
    .arrayFilters(
      Arrays.asList( Filters.in("item.rateCardId",Arrays.asList(1,2)) )
    ), 
  ProductRates.class
);

您需要确保底层Java驱动程序是3.6.x版本或更高版本,以便拥有
arrayFilters()
,甚至可能支持添加
UpdateOptions()

我发现Neil的答案在解决这个问题时很有用,但我想提供一个与他代码片段中的调用稍有不同的调用

getMongoTemplate().getCollection("ProductRates").updateMany(
    new Document().append("rates.rateCardId", 1234),
    new Document().append("$set", new Document().append("rates.$[item].rate", 200)),
    new UpdateOptions()
        .arrayFilters(
            Collections.singletonList( Filters.in("item.rateCardId",
                                                 Arrays.asList(1,2)) ))
);

尝试
newupdate().set(“rates.$.rate”,200)
我确实尝试过,但只更新了第一个元素。在我的例子中,我必须更新所有符合“Java驱动程序是3.6.x”标准的元素——SpringData1.5.x版本都不支持这一点。那么,是否必须升级到2.x才能使用mongo 3.6相关功能?@Kumaran如果您想要MongoDB 3.6的功能,如
arrayFilters
,那么您必须拥有支持的驱动程序。SpringMongo 2.x之前的版本使用标记为删除的弃用接口。当MongoDB4.x发布并再次进行驱动程序更新时,很可能会出现一些问题。看,我有个问题。有没有处理对象的方法?您只需添加文本,但我需要类似BasicDBObject的内容。我觉得你的答案好多了。有一个像!
getMongoTemplate().getCollection("ProductRates").updateMany(
    new Document().append("rates.rateCardId", 1234),
    new Document().append("$set", new Document().append("rates.$[item].rate", 200)),
    new UpdateOptions()
        .arrayFilters(
            Collections.singletonList( Filters.in("item.rateCardId",
                                                 Arrays.asList(1,2)) ))
);