【问题标题】:Strange behaviour with MongoDB sort operationMongoDB 排序操作的奇怪行为
【发布时间】:2020-06-25 14:04:02
【问题描述】:

这是信息收集和样本数据:

  1. 查询以获取所有带有eid:abc 并按角色排序的文档。 db.information.find({eid:"abc"}).sort({role:1}) 给予期待 结果,但是当更改eid:aaa 时,结果不会进入排序 顺序,顺序是随机的。
  2. 在将排序对象更改为role:-1 时发生冲突,其排序 以升序输出,然后对于eid:abc 输出进来 降序。它只是表现得很奇怪。

使用 MongoDB shell 版本 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"]}]

【问题讨论】:

  • 更新问题将您从不同查询中获得的所有响应。
  • 语法应该是.sort({ "role": 1 }) 而不是.sort:{role: 1}。虽然我认为你实际上在 shell 中使用了正确的语法。

标签: database mongodb sorting


【解决方案1】:

这是我在使用 Mongo 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" ] }

【讨论】:

    猜你喜欢
    • 2011-03-13
    • 2017-07-27
    • 1970-01-01
    • 2012-12-17
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    相关资源
    最近更新 更多