2013-09-27 50 views
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 } ] } 

是否有人有一个秘密武器来做到这一点?

谢谢,

+0

这很奇怪,应该工作,如果我使用'{'stp.KEY1':-1}'反向排序,而不是_does_工作。 – JohnnyHK

+0

你是否认为它的作品降序而不是升序? –

+0

现在我记得它为什么如此行事:当您按数组中的字段升序排序时,文档将使用每个文档元素的最小值进行排序。因为前三个文档中的第一个元素没有“KEY1”字段,所以这些字段是第一个。当你降序排序时,它取所有元素的最大值,以便其丢失的元素不会影响它。 – JohnnyHK

回答

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

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