基于嵌入对象的记录对集合进行排序

时间:2011-05-14 13:00:20

标签: mongodb mongoid

给定一个用户列表,每个用户都有自己的嵌入式项目(带时间戳)。如何获得用户列表及其最新项目?

例如:

{"_id" : ObjectId("4dcc2a5b3db44135cf000004"),
 "name" : "User1",
 "projects" : [
   {"created_at" : ISODate("2011-05-13T08:16:22Z"),
    "_id" : ObjectId("4dcce8d63db4410f04000001"),
    "name" : "User1 Project 1"
   },
   {"created_at" : ISODate("2011-05-13T08:16:22Z"),
    "_id" : ObjectId("4dcce8d63db4410f04000002"),
    "name" : "User1 Project 2"
   }
 ]
}
{"_id" : ObjectId("4dcc2fed3db44135cf000007"),
 "name" : "User2",
 "projects" : [
   {"created_at" : ISODate("2011-05-13T09:36:33Z"),
    "_id" : ObjectId("4dccfba13db4410f68000001"),
    "name" : User2 Project 2"
   }
 ]
}

我希望以表格方式显示这些数据: |用户名|最新项目名称|

我意识到使用mongoid我可以做类似

的事情
users = User.all
users.each do | user |
   p user.name
   p user.latest_project_name
end

with latest_project_name as :
   def latest_project_name
      self.projects.desc(:created_at).try(:name) || ''
   end

问题是: 1.这会在sql中引入n + 1个问题吗? 2.如果我想按最新项目名称对表格进行排序?我可以在mongodb里面这样做吗?或者我必须做一个Array.sort吗?

注意:我对mongodb很新,所以这可能是一个设计问题。还在弄清楚如何在mongodb中思考。

2 个答案:

答案 0 :(得分:3)

您无法在此阶段对嵌入式文档进行排序,相反,如果您需要对项目进行排序,则应将它们拆分为自己的集合,并在用户和项目之间使用文档引用。

请参阅:https://jira.mongodb.org/browse/SERVER-142

作为一小部分,你可以使用_id字段进行排序,因为ObjectID包含一个时间戳(实际上它不需要你的created_at字段,尽管它没有受到伤害)。如果您想了解有关ObjectID格式的更多信息,请参阅:http://www.mongodb.org/display/DOCS/Object+IDs

答案 1 :(得分:1)

如果'projects'总是按'created_at'排序,那么你可以使用$ slice运算符来获取'projects'数组的最后N个条目。否则,您需要在客户端对“项目”数组进行排序,并在应用程序级别进行切片。