我有两个这样的集合:
var Users = [
{
'ID' : 1,
'NAME' : 'Seth'
},
{
'ID' : 2,
'NAME' : 'John'
}
];
var Posts = [
{
'ID' : 1,
'TEXT' : 'blalalalalala...',
'USER' : 1
},
{
'ID' : 3,
'TEXT' : 'blalalalalala....',
'USER' : 2
}
];没有Seth的ID,我如何才能获得Seth创建的帖子?(按名称查询: Seth)
发布于 2014-07-16 17:23:48
如果这是您的模式,则无法在一个查询中按名称获取给定用户的帖子。在您的应用程序中,您必须执行两个查询。第一个获取给定NAME的ID,第二个获取给定USER的帖子。这在MongoDB文档中被称为“手动引用”,它的工作原理如下:
var id = db.Users.findOne({ "NAME" : "Seth" });
var posts = db.Posts.find({ "USER" : id });如果您确实想用一个查询来实现这一点,那么您将不得不考虑在用户文档内的数组中嵌入帖子,使用DBRefs (您需要小心使用),或者对于某些ODM,如Mongoose,使用"population“。
更新:
考虑到OP提供的新信息,如果您希望查找尚未删除的用户的所有帖子,并且不希望每次都迭代大型数组,我建议添加一个可以在删除用户时设置为true的USER_DELETED字段。
因此,如果删除了具有{ "ID" : id }的用户,您将按如下方式运行查询:
db.Posts.update({ "USER" : id }, { "$set" : { "USER_DELETED" : true } });这会将该用户的所有帖子标记为属于已被删除的用户。因此,当您想要检索仍然存在的所有用户的帖子时,您可以运行:
db.Posts.find({ "USER_DELETED" : { "$ne" : true } });或者你可以沿着这些路线做一些事情。如果您知道所有文档的USER_DELETED字段都设置为false,并且用户仍然在附近,那么您可以只查询那些将标志设置为false的文档。
当然,您仍然需要转换旧数据以遵循此模式,但这可以通过包含以下内容的一次性操作来实现:
为每个帖子查找deleted.
USER_DELETED标志。这应该是解决你面临的问题的更好方法。
https://stackoverflow.com/questions/24776617
复制相似问题