【问题标题】:MongoDB update $push with $sort to array of arraysMongoDB 使用 $sort 更新 $push 到数组数组
【发布时间】:2018-07-14 01:09:07
【问题描述】:

我有一份格式为:

{
    "_id": "test",
    "TestArr": [
        [1, 2],
        [2, 3],
        [3, 4]
    ]
}

我想在“TestArr”数组中插入另一个数组,同时按每个子数组中的第二项排序。

我已经确认我可以这样做:

db.ArrayTest.update(
    { "_id" : "test" },
    {
       $push: {
           "TestArr" : {
               $each : [[6,3]],
               $sort: 1 
           }
       }
    }
 )

这会导致文档:

{ 
    "_id" : "test", 
    "TestArr" : [
        [1.0, 7.0], 
        [2.0, 3.0], 
        [3.0, 4.0], 
        [6.0, 3.0]
   ]
}

我真正想要的是:

{ 
    "_id" : "test", 
    "TestArr" : [
        [2.0, 3.0],
        [6.0, 3.0]
        [3.0, 4.0],
        [1.0, 7.0]   
   ]
}

$sort : 1 在该更新中似乎正在对整个子数组进行排序。我知道在对文档数组进行排序时,我可以使用 $sort : { field: 1 } 指定特定的子字段进行排序。不确定如何使用子数组的特定项索引指定排序。

感谢任何帮助。

【问题讨论】:

  • 您可以在特定索引上使用$position 修饰符来$push
  • 您好!您可以先进行更新,然后分别对结果数组进行排序……就像在两个不同的查询中一样?

标签: mongodb mongodb-query


【解决方案1】:

这是使用您的示例数据创建的集合ArrayTest

{
        "_id" : "test",
        "TestArr" : [
                [ 1, 7 ],
                [ 2, 3 ],
                [ 3, 4 ]
        ]
}

输入聚合查询:

db.ArrayTest.aggregate([
    {
        $match : { "_id" : "test" }
    },
    {
        $unwind : "$TestArr"
    },
    {
        $sort : { "TestArr.1" : 1 }
    },
    {
        $group:{
            _id : "$_id",
            TestArr : {$push:"$TestArr"}
        }
    }
])

这里我们首先使用$unwind 阶段,然后使用$sort 阶段按子数组中的第二个元素对子数组进行排序。

输出:

{
    "_id" : "test",
    "TestArr" : [ 
        [ 2, 3 ],
        [ 3, 4 ],
        [ 1, 7 ]
    ]
}

这是排序后的数组。

如果更新和排序可以单独进行,可以先插入新的子数组,然后使用该命令进行排序。

请试试这个,如果它有效,请告诉我们!

【讨论】:

  • 我希望使用 Update 的 $sort 函数在一个 DB 交互中做到这一点。位置可以工作,但我必须进行查找,计算正确的位置然后更新。这可能是最好的方法,插入所有项目,然后使用聚合进行排序以展开、排序、推回数组并更新原始记录。
猜你喜欢
  • 1970-01-01
  • 2014-06-09
  • 1970-01-01
  • 2016-07-30
  • 1970-01-01
  • 2015-11-28
  • 2013-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多