简体   繁体   中英

Mongo distinct query with sort not working

I'm running a query in mongo using php like this:

$column ='address.roadname';



(new MongoDB\Client())->db->mycollection->distinct($column,[],['$sort'=> [$column => 1]]);

The query gives results, but those are not sorted.
What am I missing?

The data are just strings "nested" into inner object
What I expect is a list of street names sorted alphabetically

sample data:

[
  {
    "name": "tizio",
    "address": [
      {
        "roadType": "via",
        "roadname": "Roma",
        "number": "12 bis",
        "city": "Milano"
      },
      {
        "roadType": "via",
        "roadname": "Emilia",
        "number": "124",
        "city": "Modena"
      },
      {
        "roadType": "via",
        "roadname": "Appia",
        "number": "89",
        "city": "Genova"
      }
    ]
  },
  {
    "name": "caio",
    "address": [
      {
        "roadType": "vicolo",
        "roadname": "stretto",
        "number": "12",
        "town": "Monza"
      },
      {
        "roadType": "largo",
        "roadname": "Garibaldi",
        "number": "24",
        "city": "Modena"
      },
      {
        "roadType": "piazza",
        "roadname": "Armi",
        "number": "26",
        "city": "Rovigo"
      }
    ]
  },
  {
    "name": "sempronio",
    "address": [
      {
        "roadname": "Roma",
        "number": "15",
        "city": "Milano"
      },
      {
        "roadType": "via",
        "roadname": "Po",
        "number": "4",
        "city": "Torino"
      },
      {
        "roadType": "largo",
        "roadname": "Garibaldi",
        "number": "9",
        "community": "Genova"
      }
    ]
  }
]

what I expect:

Appia,Armi,Emilia,Garibaldi,Po,Roma,Stretto

note: if I run it on mongo console


db.mycollection.distinct("address.roadname").sort() 

I got the expected result

The PHP implementation of distinct does have a sort option, see https://docs.mongodb.com/php-library/v1.7/reference/method/MongoDBCollection-distinct/

In your shell example,

db.mycollection.distinct("address.roadname")

returns an array, so when you run .sort() on that it is using the javascript Array.sort method.

The PHP distinct function also returns an array, so use the sort function on it.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM