我有两个这样的集合:
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创建的帖子? (按名称查询:Seth)
答案 0 :(得分:1)
如果这是您的架构,则无法在一个查询中按名称获取给定用户的帖子。在您的应用程序中,您必须执行两个查询。第一个让ID
获得NAME
,第二个获得USER
的帖子。这在MongoDB文档中称为“手动引用”,它可以像这样工作:
var id = db.Users.findOne({ "NAME" : "Seth" });
var posts = db.Posts.find({ "USER" : id });
如果您确实想要使用一个查询执行此操作,那么您将不得不考虑使用DBRefs(您需要小心)在用户文档中的数组中嵌入帖子,或者在一些ODM如Mongoose的情况,使用“population”。
<强>更新强>
鉴于OP提供的新信息,如果您想查找尚未删除的用户的所有帖子,并且您不希望每次都迭代大型数组,我建议添加删除用户时可以设置为USER_DELETED
的{{1}}字段。
因此,如果删除了true
的用户,您将按如下方式运行查询:
{ "ID" : id }
然后,该用户将该用户的所有帖子标记为属于已删除的用户。因此,当您想要检索仍然存在的所有用户的帖子时,您将运行:
db.Posts.update({ "USER" : id }, { "$set" : { "USER_DELETED" : true } });
或者你可以沿着这些方向做点什么。如果您知道所有文档的db.Posts.find({ "USER_DELETED" : { "$ne" : true } });
字段设置为USER_DELETED
,如果用户还在,那么您只需查询那些标记设置为false的文档。
当然,你仍然需要转换旧数据以遵循这种模式,但这可以通过一次性操作来实现,包括:
false
标记。 这应该是解决您所面临问题的更好方法。