Mongodb删除没有相关文档的文档

时间:2013-07-30 01:33:46

标签: mongodb

是的,标题可能听起来很傻但我有两个收藏:访客和聊天。聊天有访客,而访客有很多聊天。我会定期删除{x 1}}字段低于x天的访问者,但我不想删除聊天的访问者,因此我需要一种方法last_activity

我有第一部分的工作代码(最后一项活动),需要第二部分的帮助:

delete from visitors where last_activity < days_unix_milliseconds and _id not in(select visitor_id from chats)

2 个答案:

答案 0 :(得分:6)

我的建议是更改您的架构,以便可以只用一个查询来执行此操作。在这种情况下,我可能只保留一个字段,每个visitor告诉你它有多少聊天。每次用户开始聊天时,您都可以简单地增加:

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 } } );

答案 1 :(得分:2)

因此,每个聊天都有一个字段visitor_id,并且您只想删除_id在聊天中未显示为visitor_id的访问者?您必须循环访问所有访问者,检查每个访问者last_activity,如果是候选删除,请与该访问者的find()进行聊天_id。如果没有文档,您可以删除该访问者。

当您遍历所有访问者时,使用MongoDB游标(find()的结果)进行迭代。光标的实现方式使您可以在迭代时从底层集合中安全地删除文档。

诀窍在于,您不会尝试在单个remove()电话中表达所有内容。您作为迭代的一部分进行迭代,检查和删除。您希望通过在聊天集合中添加find()上的索引来确保循环内的visitor_id非常快。