对mongodb中的数组结构进行排序查询

时间:2015-07-18 13:38:42

标签: arrays mongodb sorting

我在MongoDB中有一个包含数组结构的文档。 如何按升序对数组元素进行排序?

以下是输入:

{
    "id": 1,
    "name": "sanjay",
    "address": "Odisha",
    "shoes": [
        {
            "brand": "puma",
            "size": "10"
        },
        {
            "brand": "bata",
            "size": "11"
        },
        {
            "brand": "rebook",
            "size": "9"
        },
        {
            "brand": "adidas",
            "size": "7"
        },
        {
            "brand": "bata",
            "size": "8"
        }
    ]
}

任何人都可以帮我查询按键的升序排序我的所有数组元素" size"?

以下是所需的输出。

{
    "id": 1,
    "name": "sanjay",
    "address": "Odisha",
    "shoes": [
        {
            "brand": "adidas",
            "size": "7"
        },
        {
            "brand": "bata",
            "size": "8"
        },
        {
            "brand": "rebook",
            "size": "9"
        },
        {
            "brand": "puma",
            "size": "10"
        },
        {
            "brand": "bata",
            "size": "11"
        }
    ]
}

你能帮我找一下确切的查询吗?

此致 桑杰

1 个答案:

答案 0 :(得分:1)

在您的示例数据中,shoes.size是字符串类型。在排序之前,您需要将其更改为Int。您可以使用以下查询来执行此操作。

db.collection.find().forEach(function(data) {
    for (var ii = 0; ii < data.shoes.length; ii++) {
    printjson(data._id);
    print(data.shoes[ii].size);
    db.shoe.update({
        "_id": data._id,
        "shoes.size": data.shoes[ii].size
    }, {
        "$set": {
            "shoes.$.size": parseInt(data.shoes[ii].size)
        }
    });
    }
});

更改后,使用aggregation按以下查询排序shoes数组:

db.collection.aggregate({
    $unwind: "$shoes"
}, {
    $sort: {
    "shoes.size": 1
    }
}, {
    $group: {
    _id: "$_id",
    "shoes": {
        "$push": "$shoes"
    },
    "name": {
        $first: "$name"
    }
    }
}).pretty()

修改

如果您要选择特定的brand,请在match条件中添加条件。

db.collection.aggregate({
    $unwind: "$shoes"
}, {
    $match: {
    "shoes.brand": "bata"
    }
}, {
    $sort: {
    "shoes.size": 1
    }
}, {
    $group: {
    _id: "$_id",
    "shoes": {
        "$push": "$shoes"
    },
    "name": {
        $first: "$name"
    }
    }
}).pretty()