我运行在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查询。请建议是否有任何好书或教程,我可以参考。
我发现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)) ))
);
这应该是:
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()
我试图添加一个过滤器,需要参数作为FilterConfig给出。我将它添加到WebApplication ation初始::onStartup(ServletContext容器)方法中,并且配置良好(init方法使用正确的FilterConfig调用)。 关键是我使用的是SpringSecurityWebSecurityConfigureAdapter,我的过滤器从未被调用过(不在过滤器链中)。如
我所拥有的 预期产出 实际产量 这只是一个例子。在我的真实代码中,我正在对我的全局状态(useContext, useReduer)执行删除操作。 是一个ID数组。
问题内容: 在大部分操作pandas可以与运营商链接(来完成,等),但我发现过滤行唯一方法是通过正常的托架索引 这没有吸引力,因为它要求我先分配df一个变量,然后才能根据其值进行过滤。还有以下内容吗? 问题答案: 我不确定你想要什么,最后一行代码也无济于事,但是无论如何: “链式”过滤是通过“链接”布尔索引中的条件来完成的。 如果要链接方法,可以添加自己的mask方法并使用该方法。
问题内容: 在ES中是否在查询之前应用了过滤器? 举例来说,我正在做一个非常缓慢的模糊搜索,但是我只是在很小的日期范围内进行。例如,您可以看下面的(PHP): 在尝试进行较慢的搜索之前,是否会应用过滤器? 逻辑将要求先运行筛选器,然后再运行查询,但是我想确定一下。 问题答案: 如果使用-query,则会在对文档计分之前应用过滤器。 通常,这会大大加快速度。但是,模糊查询将仍然使用输入来构建更大的查
问题内容: 我在Mongodb 3.6上运行,带有mongo驱动程序3.4.3和spring数据mongo 1.5.10。下面是我的文档结构 正在尝试对数据进行批量更新,如下所示 现在,尝试将此代码转换为Java。下面是我能够进行批量更新的代码。不出所料,由于$ []的使用,以下查询将更新所有文档。我试图弄清楚如何使用位置数组更新运算符(例如$ [one])在此处应用数组过滤器。 另外,我找不到足
问题内容: 我有一个像这样的数组: 现在,我想按某种条件过滤该数组,只保留值等于2的元素,并删除值不等于2的所有元素。 所以我的预期结果数组将是: 注意:我想保留原始数组中的键。 如何使用PHP做到这一点?有内置功能吗? 问题答案: