【问题标题】:MongoDB query result not as expected using Spring Boot使用 Spring Boot 的 MongoDB 查询结果与预期不符
【发布时间】:2020-05-07 04:53:28
【问题描述】:

我遇到了一个与从 MongoDB 集合中获取数据相关的问题。

我在 MongoDB 数据库中有以下集合:

db.inventory.insertMany([
       { item: "journal", qty: 25, tags: ["blank", "red"], dim_cm: [ 14, 21 ] },
       { item: "planner", qty: 75, tags: ["blank", "red"], dim_cm: [ 22.85, 30 ] },
       { item: "postcard", qty: 45, tags: ["blue"], dim_cm: [ 10, 15.25 ] }
])

我有以下查询:

db.inventory.find( { dim_cm: { $gt: 25 } } )

结果:{ item: "planner", qty: 75, tags: ["blank", "red"], dim_cm: [ 22.85, 30 ] }

但是,我想要的结果应该是:

{ item: "planner", qty: 75, tags: ["blank", "red"], dim_cm: [ 30 ] }

是否有可能得到提到的结果。我尝试了不同的方法,但不幸的是我无法找到任何解决方案。

【问题讨论】:

  • 数组字段dim_cm: [ 22.85, 30] 中的两个值是什么?你只想要数组的第二个元素。
  • 我认为结果是正确的,因为它具有小于和 25 和大于 25 的 dim_cm 值。当您查询大于 25 时,它将匹配第二项,因为它有一项。结果没有问题
  • 如果您需要获取大于 25 的项目,一旦执行查询并在应用程序级别删除不需要的项目怎么办
  • @prasad_ 是的,我只想要第二个元素。
  • @SajithVijesekara 是的,它是正确的,但我想要没有 22.85 的结果,因为它小于 25。

标签: mongodb mongodb-query spring-data-mongodb


【解决方案1】:

我们可以在aggregate管道中使用$filter来过滤数组

类似

db.collection.aggregate([
  {
    $match: { // to filter the documents 
      dim_cm: { $gt: 25 }
    }
  },
  {
    $project: {
      _id: 1,
      item: 1,
      qty: 1,
      tags: 1,
      dim_cm: {
        $filter: { // to filter the array
          input: "$dim_cm",
          as: "item",
          cond: {
            $gt: ["$$item", 25]
          }
        }
      }
    }
  }
])

你可以在这里测试Mongo Playground

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-16
    • 2021-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多