Java 如何使用带ArrayFilter的过滤位置运算符应用更新
我在Mongodb 3.6上运行,mongo驱动程序3.4.3和spring数据mongo 1.5.10。下面是我的文件结构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
{
"_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)) ))
);