gpt4 book ai didi

arrays - MongoDB 在嵌套数组中搜索

转载 作者:行者123 更新时间:2023-12-04 09:38:14 26 4
gpt4 key购买 nike

我有一个这样结构的集合(带有示例数据):

{
name: "Billie Jean",
active: false,
ranges: [
{ sfeMin: -6.75 , sfeMax: -7 , cilMin: 0.75 , cilMax: 0.75 },
{ sfeMin: -7.25 , sfeMax: -7.5 , cilMin: 1.25 , cilMax: 1.25 },
{ sfeMin: -7.5 , sfeMax: -7.75 , cilMin: 1.5 , cilMax: 1.5 },
{ sfeMin: -7.75 , sfeMax: -8 , cilMin: 1.75 , cilMax: 1.75 },
{ sfeMin: -6.5 , sfeMax: -6.75 , cilMin: 0.5 , cilMax: 0.5 },
{ sfeMin: -7 , sfeMax: -7.25 , cilMin: 0 , cilMax: 0 }
]
},
{
name: "Louis Armstrong",
active: true,
ranges: [
{ sfeMin: -8 ,sfeMax: 8 , cilMin: 0 , cilMax: 6 },
{ sfeMin: -8 ,sfeMax: 8 , cilMin: 0 , cilMax: 6 },
{ sfeMin: -8 ,sfeMax: 8 , cilMin: 0 , cilMax: 6 },
{ sfeMin: -8 ,sfeMax: 8 , cilMin: 0 , cilMax: 6 }
]
}

(这是插入集合中的一些数据示例)。

我需要的是搜索此集合中的某个项目是否处于事件状态并具有值,我们将其命名为 x,它介于 sfeMin 和 sfeMax 之间,而另一个值,让我们将其命名为 y,它介于 cilMin 和 cilMax 之间。

有 x=-8 和 y=0,使用这个过滤器:
{ $and: [{ active: true }, { 'ranges.sfeMin': { $gte: -8 } }, { 'ranges.sfeMax': { $lte: -8 } }, { 'ranges.cilMin': { $gte: 0 } }, { 'ranges.cilMax': { $lte: 0 } } ]}

不应该找到任何值。

但删除 {active: false}或者将所有记录的值切换为 true 以表示事件,查询返回名为“Billie Jean”的集合项,这不应该(至少在我想要的行为中)。

让我们逐步计算出有关记录的查询:
  • 所有 sfeMin 都是 >= -8
  • 唯一的 sfeMax <= -8 是范围数组的第四个条目 (-8)
  • 对于这一行(sfeMin = -7.75 和 sfeMax= -8)cilMin >=0(实际上是 1.75)但 cilMax 是 不是 <= 0(同样是 1.75)。

  • 似乎 MongoDB 将 range 数组视为单个扁平记录,而不是逐行在数组中运行查询。将数组视为一个单一的大图可以认为查询对 Billie 有效,因为所有值都存在且正确,但跨越不同数组的行。

    这不是我要找的。

    最佳答案

    你这样做的问题是查询不会知道范围过滤器必须是同一个对象的一部分,它会查看数组的所有对象,无论是否存在于同一个对象中。

    您的查询查询 ranges 所在的文档数组至少有一个包含字段 sfeMin gte to -8 的嵌入文档和至少一个包含字段 sfeMax 等于 -8 的嵌入文档(但不一定是相同的嵌入文档),依此类推

    我还没有测试过,但我认为应该这样做:

    {
    active: true,
    ranges: { $elemMatch: { sfeMin: { $gte: -8 }, sfeMax: { $lte: -8 }, cilMin: { $gte: 0 }, cilMax: { $lte: 0 } }}
    }

    关于arrays - MongoDB 在嵌套数组中搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62446846/

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