Mongodb删除没有关联文档的文档
是的,这个标题听起来很傻,但我有两个收藏:访客和聊天。聊天有访客,而访客有很多聊天。我会定期删除最后活动字段小于x天的访客,但我不想删除聊天的访客,因此我需要一种从访客中删除最后活动Mongodb删除没有关联文档的文档,mongodb,Mongodb,是的,这个标题听起来很傻,但我有两个收藏:访客和聊天。聊天有访客,而访客有很多聊天。我会定期删除最后活动字段小于x天的访客,但我不想删除聊天的访客,因此我需要一种从访客中删除最后活动
Visitors.remove({
last_update: {
$lt: (new Date()).getTime() - 3600000 * 24 * 7
}
}, function(error){
});
因此,每个聊天都有一个字段visitor\u id,您想只删除其_id在聊天中不显示为visitor\u id的访客吗?您必须循环访问所有访问者,检查每个访问者的最后一个活动,如果它是要删除的候选项,请使用该访问者的id在聊天中查找。如果没有找到任何文档,您可以删除该访问者
当您迭代所有访问者时,您可以使用MongoDB游标来完成该操作,该游标是查找的结果。游标的实现方式使您可以在遍历基础集合时安全地从基础集合中删除文档
诀窍在于,不要试图在一个remove调用中表达所有内容。作为迭代的一部分,您可以进行迭代、检查和删除。您希望通过向chats集合添加一个visitor_id索引,确保循环中的查找速度非常快 我的建议是更改您的模式,以便只需一个查询即可完成此操作。在这种情况下,我可能只会为每个访问者保留一个字段,告诉您它有多少聊天记录。每次用户开始与以下用户聊天时,您都可以简单地增加该值:
db.visitors.update( { visitor_id: XXX }, { $inc: { 'chat_count': 1 } } );
当它结束时:
db.visitors.update( { visitor_id: XXX }, { $inc: { 'chat_count': -1 } } );
然后,删除所有没有聊天的访问者非常简单:
db.visitors.remove( { last_activity: { $lt: XXX }, chat_count: { $lt: 1 } } );
所有这些都是正确的,因为MongoDB中没有连接。您不能选择位置。您可以在代码中选择、选择和循环。他建议的SQL版本也没有使用任何联接。不在选择中是联接。它可能不是有效的SQL,但它是一个查询的概念,服务器需要读取两个表才能生成结果。是否使用JOIN关键字无关紧要。如果愿意,Mongo查询位于单个集合或表上。按照设计,您不能要求mongo链接两个集合。