给定一个用户列表,每个用户都有自己的嵌入式项目(带时间戳)。如何获得用户列表及其最新项目?
例如:
{"_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中思考。
答案 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个条目。否则,您需要在客户端对“项目”数组进行排序,并在应用程序级别进行切片。