如何使用带 arrayFilters 的过滤位置运算符应用更新
How to apply update using Filtered positional operator with arrayFilters
我 运行 使用 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] )在此处应用数组过滤器。
WriteResult wr = getMongoTemplate().updateMulti(
new Query(where("rates.rateCardId").is(1234)),
new Update().set("rates.$[].rate", 200),
ProductRates.class);
此外,我找不到足够的教程或文档来建议如何在 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)) ))
);
我 运行 使用 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] )在此处应用数组过滤器。
WriteResult wr = getMongoTemplate().updateMulti(
new Query(where("rates.rateCardId").is(1234)),
new Update().set("rates.$[].rate", 200),
ProductRates.class);
此外,我找不到足够的教程或文档来建议如何在 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)) ))
);