获取并排序数组Mongodb

时间:2015-03-16 11:57:24

标签: mongodb mongodb-query aggregation-framework

我有这样的文件

{
    "id": "1",
    "myarray": [
        {
            "_id": "4",
            "name": "d",
            "order": 4
        },
        {
            "_id": "1",
            "name": "a",
            "order": 1
        },
        {
            "_id": "2",
            "name": "b",
            "order": 2
        }
    ]
}

我想从db获取时按顺序查看数组中的排序数据 我正在尝试下面的一些查询,但似乎不行,没有任何改变

 db.collection.aggregate([{$unwind: "$myarray"},{$project: {orders:"$myarray.order"}},{$group: {_id:"$_id",min:{$min: "$orders"}}},{$sort: {min:1}}])

db.myarray.find({},{$sort:{"myarray.order":-1}})
db.collection.find({"_id":"1"}).sort({"myarray.order":1})

什么是正确的查询?

我需要这样的东西

db.collection.find({"_id":"1"}).sort({"myarray.order":1})

2 个答案:

答案 0 :(得分:3)

您可以使用聚合管道

db.collection.aggregate([
    { "$unwind": "$myarray" }, 
    { "$sort": { "myarray.order": 1 }}, 
    { "$group": { "_id": "$_id", "myarray": { "$push": "$myarray" }}}
])

答案 1 :(得分:1)

要对回复进行排序,而不是永久排序:

db.collection.aggregate([
    { "$match": { "_id": 1 } },
    { "$unwind": "$myarray" },
    { "$sort": { "myarray.order": 1 } },
    { "$group": {
        "_id": "$_id",
        "myarray": { "$push": "$myarray" }
    }}
])

要永久改变:

db.collection.update(
    { "_id": 1 }, 
    { "$push": { "myarray": { "$each": [], "sort": { "order": 1 } } }},
    { "multi": true }
)

如果这是您通常想要的,那么您最好的选择通常是$sort数组,$push一个或多个新元素通过$each作为另一个修饰符。

当然,如果您从数组中$pull个元素,那么"当前"语法需要发出另一个查询,以便按照已经显示的方式对数组进行排序。

通常最好将结果保持在您期望的顺序,而不是在后期处理中进行排序,因为后者的成本总是高于前一种方法。