排序复杂的对象问题

时间:2013-09-27 11:34:10

标签: mongodb

我需要以这种方式对我的收藏进行排序:

db.collection.find().sort({'stp.KEY1':1})
{ "_id" : ObjectId("5241eb2ed8b991543d931eee"), "stp" : [  {  "KEY2" : 5 },  {  "KEY1" : 500 } ] }
{ "_id" : ObjectId("521ef6e6d7b99105020cb0b9"), "stp" : [  {  "KEY2" : 5 },  {  "KEY1" : 1000 } ] }
{ "_id" : ObjectId("522dd25fd8b9912822498a62"), "stp" : [  {  "KEY3" : 1000 },  {  "KEY1" : 1000 } ] }
{ "_id" : ObjectId("5243fb6ed8b991641ef6a5b9"), "stp" : [  {  "KEY1" : 300 } ] }
{ "_id" : ObjectId("5243fbb2d8b991651ea98477"), "stp" : [  {  "KEY1" : 500 } ] }
{ "_id" : ObjectId("5245611bd7b991d87cb3ec3c"), "stp" : [  {  "KEY1" : 1000 } ] }

有人为此做了秘密调料吗?

谢谢,

1 个答案:

答案 0 :(得分:0)

目前,您无法通过子文档键对集合进行排序。发出命令时db.collection.find().sort({'stp.KEY1':1})只会在stp键上对其进行排序,而这不是您想要的。

所以你现在只有几个选择

  1. 在您的应用程序层中对此进行排序。为此,您需要返回文档,然后使用您正在使用的编程语言对其进行排序。
  2. 但如果您总是希望对结果进行排序,则可以通过在$ push运算符中使用$ sort来实现此目的。在你的情况下,你会做这样的事情:
  3. db.coll.update(
      { _id : ID },
      { 
         $push: {
           stp: {
              $each: [{ KEY1: 999}],
              $sort: { KEY1: 1 }
           }
         }
      })
    

    这样,在任何更新后,您的子文档将被排序。然后,如果你检索它,你将不需要对它进行排序。