MongoDB-字段类型阵列上的查询基础

发布于 2025-02-13 20:05:06 字数 372 浏览 1 评论 0原文

我在MongoDB中有阵列查询有问题 I have collection with documents format like so:

{
    'data':
    [
        { 'itv': [0, 1], 'name': 'a' },
        { 'itv': [6, 8], 'name': 'b' },
        ...
    ]
}

I want to query documents that data have at least one element that matches the condition itv[1]-itv[0] > n

I am having a problem with array query in mongoDB
I have collection with documents format like so:

{
    'data':
    [
        { 'itv': [0, 1], 'name': 'a' },
        { 'itv': [6, 8], 'name': 'b' },
        ...
    ]
}

I want to query documents that data have at least one element that matches the condition itv[1]-itv[0] > n

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

沉鱼一梦 2025-02-20 20:05:06

您可以在聚合管道中对此进行计算,也可以使用查询语言使用$ expr,例如:

const n = 1;
db.collection.find({
  $expr: {
    $gt: [
      {
        $size: {
          $filter: {
            input: "$data",
            cond: {
              $gt: [
                {
                  $subtract: [
                    {
                      "$arrayElemAt": [
                        "$this.itv",
                        1
                      ]
                    },
                    {
                      "$arrayElemAt": [
                        "$this.itv",
                        0
                      ]
                    }
                  ]
                },
                n
              ]
            }
          }
        }
      },
      0
    ]
  }
})

mongo游乐场

我的个人建议是预先计算差异,这意味着新的模式看起来会有些东西像:

{
    'data':
    [
        { 'itv': [0, 1], 'diff': 1, 'name': 'a' },
        { 'itv': [6, 8], 'diff': 2, 'name': 'b' },
        ...
    ]
}

现在您可以使用一个简单查找查询查询此问题:

const n = 1
db.collection.find({ 'data.diff': { '$gt': n }})

要追溯更新您的集合,您可以使用此更新:

db.collection.updateMany({},
[
  {
    $set: {
      data: {
        $map: {
          input: "$data",
          in: {
            $mergeObjects: [
              "$this",
              {
                diff: {
                  $subtract: [
                    {
                      $arrayElemAt: [
                        "$this.itv",
                        1
                      ]
                    },
                    {
                      $arrayElemAt: [
                        "$this.itv",
                        0
                      ]
                    }
                  ]
                }
              }
            ]
          }
        }
      }
    }
  }
])

游乐场

You can calculate this either in the aggregation pipeline or using $expr with the query language, like so:

const n = 1;
db.collection.find({
  $expr: {
    $gt: [
      {
        $size: {
          $filter: {
            input: "$data",
            cond: {
              $gt: [
                {
                  $subtract: [
                    {
                      "$arrayElemAt": [
                        "$this.itv",
                        1
                      ]
                    },
                    {
                      "$arrayElemAt": [
                        "$this.itv",
                        0
                      ]
                    }
                  ]
                },
                n
              ]
            }
          }
        }
      },
      0
    ]
  }
})

Mongo Playground

My personal recommendation will be to pre-calculate the difference, this means the new schema will look a little something like:

{
    'data':
    [
        { 'itv': [0, 1], 'diff': 1, 'name': 'a' },
        { 'itv': [6, 8], 'diff': 2, 'name': 'b' },
        ...
    ]
}

Now you can query this with a simple find query:

const n = 1
db.collection.find({ 'data.diff': { '$gt': n }})

To retroactively update your collection you can use this update:

db.collection.updateMany({},
[
  {
    $set: {
      data: {
        $map: {
          input: "$data",
          in: {
            $mergeObjects: [
              "$this",
              {
                diff: {
                  $subtract: [
                    {
                      $arrayElemAt: [
                        "$this.itv",
                        1
                      ]
                    },
                    {
                      $arrayElemAt: [
                        "$this.itv",
                        0
                      ]
                    }
                  ]
                }
              }
            ]
          }
        }
      }
    }
  }
])

Update Mongo Playground

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文