嵌入式列表订购

时间:2015-09-17 07:25:58

标签: mongodb mongodb-query aggregation-framework

我有一个嵌入式项目列表的以下对象,我想编写一个查询并返回date排序的所有或特定项目。是否可以这样做或者我应该为项目设置不同的收藏品并在此处保留其参考文献?

我知道您可以使用$elemMatch匹配特定元素。

{
  "_id": "51cb12857124a215940cf2d4",
  "level1":
    [
            {
                    "name":"item00",
                    "description":"item01",
                    "date": 1238492103
            },
            {
                    "name":"item10",
                    "description":"item11",
                    "date": 1238492104
            }
    ]
}

1 个答案:

答案 0 :(得分:1)

如果您希望这些项目按日期排序,那么您最好的选择就是首先保留列表。 $push运算符明确地为此目的添加了$sort参数。

db.collection.update(
    { "_id": "51cb12857124a215940cf2d4" },
    { "$push": {
        "level1":{
            "$each":[{
                "name":"item11",
                "description":"item11",
                "date": 1238492104
            }],
            "$sort": { "date": 1 }
        }
    }
)

实际上甚至可以适应,所以你可以在一个声明中对整个集合进行排序:

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

如果没有这个,你的替代品是通过.aggregate()方法订购结果。这实际上不应该是您选择的操作,因为它需要对数组内容处理$unwind,然后对文档中的元素进行$sort操作。当然,这会在较大的选择上带来一些显着的开销:

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