PaulManningBiz
PaulManningBiz

Reputation: 11

Sorting arrays in Mongo

H have json document with array. As I can't add to beginning of array with push or addtoset I need to sort array. Example

{
  "Component": [
    {
      "Id": "PDP-1",
      "Links": {"Link": [
          {
            "Text": "Western Division",
            "Url": "/1x7-en70ai/last-minute-holidays-western-division",
            "Title": "Last minute holidays Western Division"
          },
          {
            "Text": "Browse Regions ",
            "Url": "/1x7-en6uly-10ts/last-minute-holidays-gambia/regions",
            "Title": "Last minute holidays Gambia",
            "Style": "BrowseForMore"
          },
          {
            "Text": "City of Banjul",
            "Url": "/1x6-en6vq7/holidays-city-of-banjul",
            "Title": "City of Banjul Holidays"
          },
          {
            "Text": "Western Division",
            "Url": "/1x6-en70ai/holidays-western-division",
            "Title": "Western Division Holidays"
          }
        ]},
      "Title": "Regions",
      "Type": "PDP"
    },
    {
      "Id": "PDP-2",
      "Links": {"Link": [
          {
            "Text": "Bijilo",
            "Url": "/1x7-enbmy6/last-minute-holidays-bijilo",
            "Title": "Last minute holidays Bijilo"
          },
          {
            "Text": "Browse Cities ",
            "Url": "/1x7-en6uly-10tt/last-minute-holidays-gambia/cities",
            "Title": "Last minute holidays Gambia",
            "Style": "BrowseForMore"
          },
          {
            "Text": "Banjul Beach",
            "Url": "/1x6-enakgm/holidays-banjul-beach",
            "Title": "Banjul Beach Holidays"
          },
          {
            "Text": "Bijilo",
            "Url": "/1x6-enbmy6/holidays-bijilo",
            "Title": "Bijilo Holidays"
          },
          {
            "Text": "Brufut Heights",
            "Url": "/1x6-encok8/holidays-brufut-heights",
            "Title": "Brufut Heights Holidays"
          },
          {
            "Text": "Kololi",
            "Url": "/1x6-enpnle/holidays-kololi",
            "Title": "Kololi Holidays"
          },
          {
            "Text": "Kotu",
            "Url": "/1x6-enq067/holidays-kotu",
            "Title": "Kotu Holidays"
          }
        ]},
      "Title": "Cities",
      "Type": "PDP"
    }
  ],
  "Id": "118431",
  "Template": {
    "PageTemplate": {
      "Code": "2B2",
      "text": "041 - TEMP2 - COP_CONCOU_{LAST MINUTE}"
    },
    "Category": {
      "Code": "1X7",
      "Type": "Product",
      "text": "Last minute holidays"
    },
    "GeoObject": {
      "Code": "EN6ULY",
      "text": "Gambia, The"
    },
    "GeoObjectType": {
      "Code": "1A",
      "text": "Political"
    },
    "GeoObjectSubType": {
      "Code": "10TR",
      "text": "Country"
    }
  },
  "Type": "Content",
  "Url": "/1x7-en6uly/last-minute-holidays-gambia",
  "_id": {"$oid": "528492d4c90fa9fcd0436929"}
}

I want to sort this by Style in Links.Link 'BrowseForMore'. Any idea how to do it? I thought I could add dummy array with push which could then sort it the way I want. Any help appreciated

Upvotes: 0

Views: 152

Answers (1)

Neil Lunn
Neil Lunn

Reputation: 151170

You appear to want to update the array and keep the sort order with your Links.Link.Style value at the front of the list. In which case use the $sort modifier with update.

db.collection.update(
    { _id: id },
    { $push: { "Links.Link: {$each: [doc], $sort { Style: -1 }}} }
)

The $each operator is required even if there is only one document, but can take many.

if you are trying to use $addToSet to maintain unique documents the official MongoDB line is that sets are considered to be unordered and hence the modifiers are not available here.

Upvotes: 1

Related Questions