【问题标题】:Mongodb sort array inside array of embedded documents嵌入文档数组中的MongoDB排序数组
【发布时间】:2018-05-09 11:33:21
【问题描述】:

我有以下收藏

[{
  _id: 1
  "origins": [
    {
        'depth': 100,
        'magnitudes': [
            { 'magval': 5 }, { 'magval': 6 }, { 'magval': 7 }
         ]
    },
    {
        'depth': 90,
        'magnitudes': [
            { 'magval': 5 }, { 'magval': 6 }, { 'magval': 7 }
         ]
    }
  ]
},
{
  _id: 2
  "origins": [
    {
        'depth': 100,
        'magnitudes': [
            { 'magval': 5 }, { 'magval': 6 }, { 'magval': 7 }
         ]
    },
    {
        'depth': 90,
        'magnitudes': [
            { 'magval': 5 }, { 'magval': 6 }, { 'magval': 7 }
         ]
    }
  ]
}

使用这样的查询(pymongo):

collection.update(
        {},
        {
            '$push': {
                'origins': {
                    '$each': [],
                    '$sort': {'depth': -1}
                }
            }
        }, multi=True, upsert=True
    )

...我可以就地更新我的集合,以便嵌入的原点数组按深度字段降序排序。

问题是......如何对作为每个原始对象的子对象的嵌入式幅度对象数组执行类似的就地排序?我希望原点内的大小按 magval 降序排序。

最终输出应该像这样存储回数据库中:

{
  "origins": [
    {
        'depth': 100,
        'magnitudes': [
            { 'magval': 7 }, { 'magval': 6 }, { 'magval': 5 }
         ]
    },
    {
        'depth': 90,
        'magnitudes': [
            { 'magval': 7 }, { 'magval': 6 }, { 'magval': 5 }
         ]
    }
  ]
}

【问题讨论】:

    标签: mongodb sorting


    【解决方案1】:

    在 MongoDB v3.6 中,您可以使用 array update operators $[ ]。此运算符指示更新运算符应修改指定数组字段中的所有元素。

    使用您的示例文档,即:

    db.collection.update({}, 
                         {
                          "$push": {
                                    "origins.$[].magnitudes":{
                                                              $each:[], 
                                                              $sort:{ "magval": -1 }
                                                             }
                                   }
                         }, 
                         {"multi":true, "upsert":true}
    )
    

    话虽如此,请重新考虑您的data modelling 方法;在数组数组中存储值可能会导致查询/更新困难。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-01
      • 2022-01-26
      • 1970-01-01
      • 2021-08-07
      • 2015-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多