当前位置: 首页 > 知识库问答 >
问题:

如何应用更新使用过滤位置运算符与数组过滤器

郜俊晤
2023-03-14

我运行在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查询。请建议是否有任何好书或教程,我可以参考。

共有2个答案

乐寒
2023-03-14

我发现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)) ))
);
王昊
2023-03-14

这应该是:

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做到这一点?有内置功能吗? 问题答案: