Alex Rivera | Logout

Mongodb: sort documents by array objects

Asked 2011-03-15T17:33:57.233
18

I would like to return the documents in an order sorted by which holds the lowest foo.bar value (which are array objects).

I can do db.collection.find().sort({foo.0.bar: 1}), but this only matches the first element in the array - and as you can see in the exampe below would sort item 1 first (foo.0.bar = 5), wheras I am looking to return item 2 first (foo.2.bar = 4) as it has the object with the lowest value.

{
    "name": "Item 1",
    "foo": [
        {
            "bar": 5
        },
        {
            "bar": 6
        },
        {
            "bar": 7
        }
    ]
}
{
    "name": "item 2",
    "foo": [
        {
            "bar": 6
        },
        {
            "bar": 5
        },
        {
            "bar": 4
        }
    ]
}
Edit
Report

1 Answer

4

An alternative to using map/reduce, is to store the min value from the array out as a separate field in the document which you could then order on. When you add to the array, you also update this field if the new value is lower than the currently recorded minimum.

e.g. your first document would become this (note "minbar added"):

{
    "name": "Item 1",
    "minbar" : 5,
    "foo": [
        {
            "bar": 5,
        }
        {
            "bar": 6,
        }
        {
            "bar": 7,
        }
    ]
}
answered 2011-03-15T20:22:58.343

Your Answer