2

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

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 } ] }

有人有秘诀吗?

谢谢,

4

1 回答 1

0

目前,您无法按子文档键对集合进行排序。发出您的命令时:db.collection.find().sort({'stp.KEY1':1})它仅根据stp您不想要的键对其进行排序。

所以你现在只有几个选择

  1. 在您的应用程序层中对此进行排序。为此,您需要返回您的文档,然后使用您使用的任何编程语言对其进行排序。
  2. 但是,如果您总是希望对结果进行排序,则可以通过在 $push 运算符中使用 $sort 来实现。在你的情况下,你会做这样的事情:

.

db.coll.update(
  { _id : ID },
  { 
     $push: {
       stp: {
          $each: [{ KEY1: 999}],
          $sort: { KEY1: 1 }
       }
     }
  })

这样,在任何更新后,您的子文档都会被排序。然后,如果您检索它,则无需对其进行排序。

于 2013-11-02T00:45:05.530 回答