使用$ lte和$ gte对嵌套数组进行排序

时间:2018-12-13 09:20:34

标签: mongodb mongodb-query aggregation-framework

所以我有一个看起来像这样的文档:

{   
    "prop1" : [ 
        {
            "value" : [ 
                {
                    "start" : "09:00",
                    "end" : "23:59"
                }, 
                {
                    "start" : "00:00",
                    "end" : "04:00"
                }
            ]
        }
    ]
}

我想查询数组。

这是我正在尝试的查询:

db.getCollection('someCollection').find({ 
    'prop1': {
        $elemMatch: {
            'value': {
                $elemMatch: {
                    start: { $lte: '10:00' } ,
                    end: { $gte: '10:00' }
                }
            }
        }
    }
})

这是什么问题,或者在嵌套数组的嵌套数组中查询嵌套对象的正确方法是什么?

谢谢!

更新

我需要的输出是与prorp数组具有任何对象的文件相同,该对象的值数组具有至少一个与 start end

匹配的元素
{   
        "prop1" : [ 
            {
                "value" : [ 
                    {
                        "start" : "09:00",
                        "end" : "23:59"
                    }, 
                    {
                        "start" : "00:00",
                        "end" : "04:00"
                    }
                ]
            }
        ]
    }

2 个答案:

答案 0 :(得分:1)

您可以通过 $map$filter

使用以下汇总
db.collection.aggregate([
  { "$project": {
    "prop1": {
      "$map": {
        "input": "$prop1",
        "as": "p",
        "in": {
          "value": {
            "$filter": {
              "input": "$$p.value",
              "as": "v",
              "cond": {
                "$and": [
                  { "$lte": ["$$v.start", "10:00"] },
                  { "$gte": ["$$v.end", "10:00"] }
                ]
              }
            }
          }
        }
      }
    }
  }}
])

Output

[
  {
    "prop1": [
      {
        "value": [
          {
            "end": "23:59",
            "start": "09:00"
          }
        ]
      }
    ]
  }
]

答案 1 :(得分:0)

拥有这样的架构的更好方法:

"prop1" : [ 
        {
            "value" : [ 
                {
                    "start" : {
                        "h" : 8,
                        "m" : 0
                    },
                    "end" : {
                        "h" : 23,
                        "m" : 59
                    }
                }, 
                {
                    "start" : {
                        "h" : 1,
                        "m" : 0
                    },
                    "end" : {
                        "h" : 4,
                        "m" : 0
                    }
                }
            ]
        }
    ]

并使用这样的查询

db.yourCollection.find( {"prop1.value": 
    {
        $elemMatch: { 
            'start.h': { $lte: 8 }, 'start.m': { $lte: 0 }, 'end.h': { $gte: 3 }, 'end.m': { $gte: 59 }
        }
    } 
})