我有这样两个集合:
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创建的帖子?(查询By NAME: Seth)
如果这是您的模式,那么没有办法在一个查询中按名称获取给定用户的帖子。在您的应用程序中,您必须执行两个查询。第一个是在给定NAME
的情况下得到ID
第二个是在给定USER
的情况下得到posts。这在MongoDB文档中被称为"手动引用",它将像这样工作:
var id = db.Users.findOne({ "NAME" : "Seth" });
var posts = db.Posts.find({ "USER" : id });
如果你确实想用一个查询做到这一点,那么你将不得不考虑在用户文档中的数组中嵌入帖子,使用DBRefs(你需要小心),或者在一些odm的情况下,如Mongoose,使用"population"。
更新:
给定OP提供的新信息,在您想要查找未被删除的用户的所有帖子的情况下,如果您不想每次都遍历一个大数组,我建议添加一个USER_DELETED
字段,该字段可以在用户被删除时设置为true
。
因此,如果删除了具有{ "ID" : id }
的用户,您将运行如下查询:
db.Posts.update({ "USER" : id }, { "$set" : { "USER_DELETED" : true } });
然后将该用户的所有帖子标记为属于已删除的用户。因此,当您想检索所有仍然存在的用户的帖子时,您可以运行:
db.Posts.find({ "USER_DELETED" : { "$ne" : true } });
或者你可以这样做。如果您知道所有文档的USER_DELETED
字段设置为false
,如果用户还在,那么您可以查询那些将标志设置为false的文档。
- 查找所有已删除的用户。
- 查找每个用户的帖子。
- 为每个帖子添加
USER_DELETED
标志。
这应该是解决你所面临的问题的一个更好的方法。