Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 嵌套数组中的MongoDB搜索_Arrays_Mongodb - Fatal编程技术网

Arrays 嵌套数组中的MongoDB搜索

Arrays 嵌套数组中的MongoDB搜索,arrays,mongodb,Arrays,Mongodb,我有一个这样结构的集合(带有示例数据): { 姓名:“比利·琼”, 活动:错误, 范围:[ {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}, {s

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

{
姓名:“比利·琼”,
活动:错误,
范围:[
{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}
]
},
{
姓名:“路易斯·阿姆斯特朗”,
主动:对,
范围:[
{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}
]
}
(这是插入到集合中的一些数据示例)

我需要的是搜索此集合中的某个项目是否处于活动状态,并且是否有一个介于sfeMin和sfeMax之间的值,让我们将其命名为x,以及另一个介于cilMin和cilMax之间的值,让我们将其命名为y

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=0(事实上是1.75),但cilMax是而不是问题是,您这样做的方式是查询将不知道范围筛选器必须是同一对象的一部分,它将查看数组中的所有对象,而不管同一对象中是否有

    如果
    范围
    数组中至少有一个嵌入文档包含字段sfeMin gte到-8,并且至少有一个嵌入文档(但不一定是同一个嵌入文档)包含字段sfeMax等于-8,依此类推

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

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

    这不起作用,即使我使用
    {ranges:{sfeMin:{$eq:-6.75}}
    也不会返回任何记录。啊,很抱歉我忘记了
    $elemMatch
    ,请重试?编辑后,这确实是答案。为了确定,我做了大量的测试。这似乎是个老问题。
    $elemMatch
    是正确的解决方案。这个链接可能会有帮助。