Странное поведение с операцией сортировки MongoDB - PullRequest
0 голосов
/ 13 марта 2020

Вот сбор информации и примеры данных:

  1. Запрос на получение всех документов с eid:abc и отсортирован по ролям. db.information.find({eid:"abc"}).sort({role:1}) дает ожидаемый результат, но при изменении eid:aaa результат приходит не в порядке сортировки, а порядок случайный.
  2. В случае противоречивости при изменении объекта сортировки на role:-1 вывод сортировки происходит в порядке возрастания, но затем для eid:abc вывод идет в порядке убывания. он просто странно себя ведет.

Использование версии оболочки MongoDB v4.0.6:

 information =[
      {_id:'110',role:'dev',eid:'aaa',info:["a","b"]},
      {_id:'111',role:'tester',eid:'abc',info:["a","b","c"]},
      {_id:'112',role:'admin',eid:'abc',info:["a","c"]}
      {_id:'113',role:'admin',eid:'abc',info:["a","b","c"]},
      {_id:'114',role:'dev',eid:'abc',info:["a","b","c"]},
      {_id:'115',role:'admin',eid:'aaa',info:["a","b","c"]}
 ];


 Output:

 1.when .find({eid:"aaa"}).sort:{role:1}
 => 
 [          
  {_id:'115',role:'admin',eid:'aaa',info:["a","b","c"]}
  {_id:'110',role:'dev',eid:'aaa',info:["a","b"]},
 ];

 2.when .find({eid:"abc"}).sort:{role:1}
 => [      
     {_id:'111',role:'tester',eid:'abc',info:["a","b","c"]},
     {_id:'114',role:'dev',eid:'abc',info:["a","b","c"]}
     {_id:'112',role:'admin',eid:'abc',info:["a","c"]}
     {_id:'113',role:'admin',eid:'abc',info:["a","b","c"]}];

 3.when .find({eid:"aaa"}).sort:{role:-1}
 => 
 [{_id:'110',role:'dev',eid:'aaa',info:["a","b"]}
 {_id:'115',role:'admin',eid:'aaa',info:["a","b","c"]}]

 4.when .find({eid:"abc"}).sort:{role:-1}
 => 
 [{_id:'113',role:'admin',eid:'abc',info:["a","b","c"]},
 {_id:'112',role:'admin',eid:'abc',info:["a","c"]},
 {_id:'111',role:'tester',eid:'abc',info:["a","b","c"]},
 {_id:'114',role:'dev',eid:'abc',info:["a","b","c"]}]

1 Ответ

0 голосов
/ 14 марта 2020

Это то, что я получил в аналогичной среде, используя Mon go Shell. sort отлично работает для всех четырех случаев.

Обратите внимание, что фильтр запросов find находится в поле eid, а sort применяется к полю role.

> db.sorts.find()
{ "_id" : "110", "role" : "dev", "eid" : "aaa", "info" : [ "a", "b" ] }
{ "_id" : "111", "role" : "tester", "eid" : "abc", "info" : [ "a", "b", "c" ] }
{ "_id" : "112", "role" : "admin", "eid" : "abc", "info" : [ "a", "c" ] }
{ "_id" : "113", "role" : "admin", "eid" : "abc", "info" : [ "a", "b", "c" ] }
{ "_id" : "114", "role" : "dev", "eid" : "abc", "info" : [ "a", "b", "c" ] }
{ "_id" : "115", "role" : "admin", "eid" : "aaa", "info" : [ "a", "b", "c" ] }

> db.sorts.find({ eid: "aaa" }).sort({ role: 1 })
{ "_id" : "115", "role" : "admin", "eid" : "aaa", "info" : [ "a", "b", "c" ] }
{ "_id" : "110", "role" : "dev", "eid" : "aaa", "info" : [ "a", "b" ] }

> db.sorts.find({ eid: "abc" }).sort({ role: 1 })
{ "_id" : "112", "role" : "admin", "eid" : "abc", "info" : [ "a", "c" ] }
{ "_id" : "113", "role" : "admin", "eid" : "abc", "info" : [ "a", "b", "c" ] }
{ "_id" : "114", "role" : "dev", "eid" : "abc", "info" : [ "a", "b", "c" ] }
{ "_id" : "111", "role" : "tester", "eid" : "abc", "info" : [ "a", "b", "c" ] }

> db.sorts.find({ eid: "aaa" }).sort({ role: -1 })
{ "_id" : "110", "role" : "dev", "eid" : "aaa", "info" : [ "a", "b" ] }
{ "_id" : "115", "role" : "admin", "eid" : "aaa", "info" : [ "a", "b", "c" ] }

> db.sorts.find({ eid:"abc" }).sort({ role: -1 })
{ "_id" : "111", "role" : "tester", "eid" : "abc", "info" : [ "a", "b", "c" ] }
{ "_id" : "114", "role" : "dev", "eid" : "abc", "info" : [ "a", "b", "c" ] }
{ "_id" : "112", "role" : "admin", "eid" : "abc", "info" : [ "a", "c" ] }
{ "_id" : "113", "role" : "admin", "eid" : "abc", "info" : [ "a", "b", "c" ] }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...