gpt4 book ai didi

arrays - MongoDB:按对嵌套文档数组执行的范围过滤器查找文档

转载 作者:行者123 更新时间:2023-12-04 00:51:42 27 4
gpt4 key购买 nike

考虑将分数作为嵌套文档数组收集的文档集合,如下所示(我使用的是 MongoDb 4.2):

{
"scores" : [
{ "value" : 2 },
{ "value" : 3 },
{ "value" : 4 }
]
}, {
"scores" : [
{ "value" : 8 },
{ "value" : 9 },
{ "value" : 10 }
]
}, {
"scores" : [
{ "value" : 7 },
{ "value" : 7 },
{ "value" : 10 }
]
}
现在考虑以下用例:“给我只包含 [X, Y] 范围内分数的所有文档”。换句话说,请过滤掉至少有一个值不在 [X-Y] 范围内的文档。旁注:在实际数据中,分数是实数,因此在这里执行一些 $in 查询无济于事。
让我们考虑三个范围:
  • 范围 [8, 10](一个文档应该匹配)
  • 范围 [0, 1](0 文档匹配)。
  • 范围 [5, 6](0 文档匹配)。

  • 作为 mongo 的非专家,我的第一次尝试是这样做:
    db.test.find({
    $and: [
    { "scores.value": {$gte: 8}},
    { "scores.value": {$lte: 10}}
    ]
    })
  • 案例 [8, 10]:2 条记录。
  • Case [0, 1] : 0 条记录
  • Case [5, 6] : 2 条记录

  • 所以这里有一些奇怪的东西:第一个结果表明我的查询实际上返回满足任一条件的分数(有点是 $or 而不是 $and)。但这是真的吗,我会检索第二个案例 [0, 1] 而不是 0 的所有记录。显然我在这里使用了错误的方式,但如果有人能解释我为什么,我会很高兴.
    下一个查询:
    db.test.find({
    "scores": {
    $elemMatch: {
    value: {$gte: 6.5, $lte: 6.8}
    }
    }
    })
  • 案例 [8, 10]:2 条记录。
  • Case [0, 1] : 0 条记录
  • Case [5, 6] : 0 条记录

  • 对于那个,一切都很好并且按文档/预期工作,但它没有回答我的原始用例。
    所以除了了解使用第一个查询发生了什么之外,有没有人知道实现我想要做的事情的方法?

    最佳答案

    让我们首先了解您第一次尝试时出了什么问题。
    您使用的是 Mongo 的 dot notation ,这是做什么的?

    To specify or access an element of an array by the zero-based index position


    基本上它一次评估所有数组元素。
     $and: [ 
    { "scores.value": {$gte: 8}},
    { "scores.value": {$lte: 10}}
    ]
    这些表达式中的每一个都查询整个数组,这意味着要满足它的查询,您只需要一个在范围内的值。
    您可以做的是利用 $not 运算符并结合 $elemMatch 查找要排除的元素,如下所示:
    db.collection.find({
    "scores": {
    $not: {
    $elemMatch: {
    $or: [
    {
    value: {
    $lt: 8
    }
    },
    {
    value: {
    $gt: 10
    }
    }
    ]
    }
    }
    }
    })
    Mongo Playground

    关于arrays - MongoDB:按对嵌套文档数组执行的范围过滤器查找文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65845511/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com