Сортировать вложенный массив, используя $ lte и $ gte - PullRequest
0 голосов
/ 13 декабря 2018

Итак, у меня есть документ, который выглядит следующим образом:

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

И я хочу запросить массив value .

Это запрос, который япытаясь:

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 голосов
/ 13 декабря 2018

Вы можете использовать агрегацию ниже, используя $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"] }
                ]
              }
            }
          }
        }
      }
    }
  }}
])

Выход

[
  {
    "prop1": [
      {
        "value": [
          {
            "end": "23:59",
            "start": "09:00"
          }
        ]
      }
    ]
  }
]
0 голосов
/ 13 декабря 2018

Лучший способ иметь такую ​​схему:

"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 }
        }
    } 
})
...