【问题标题】:Sort nested array using $lte and $gte使用 $lte 和 $gte 对嵌套数组进行排序
【发布时间】:2019-05-14 11:22:42
【问题描述】:

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

{   
    "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 数组具有任何对象,值数组具有至少一个与 startend 匹配的元素

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

【问题讨论】:

  • 你需要什么输出。请张贴。
  • 更新安东尼

标签: mongodb mongodb-query aggregation-framework


【解决方案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"
          }
        ]
      }
    ]
  }
]

【讨论】:

  • 感谢您的帮助,但我不能使用它以防万一。此查询必须在我无法使用聚合的 Meteor 项目中运行。
  • 你还没有提到。但它也可以在 METEOR 中使用。
  • 我不想使用聚合,因为它会让我在我的代码中改变很多东西
  • 那么find 查询是不可能的。您必须在这里使用一些 javascript 代码。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2019-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-27
    • 2019-01-06
    • 1970-01-01
    相关资源
    最近更新 更多