是的,标题可能听起来很傻但我有两个收藏:访客和聊天。聊天有访客,而访客有很多聊天。我会定期删除{x 1}}字段低于x天的访问者,但我不想删除聊天的访问者,因此我需要一种方法last_activity
我有第一部分的工作代码(最后一项活动),需要第二部分的帮助:
delete from visitors where last_activity < days_unix_milliseconds and _id not in(select visitor_id from chats)
答案 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
非常快。