0

是的,标题可能听起来很傻,但我有两个集合:访客和聊天。聊天有访客,而访客有很多聊天。我会定期删除last_activity字段低于 x 天的访问者,但我不想删除有聊天的访问者,所以我需要一种方法delete from visitors where last_activity < days_unix_milliseconds and _id not in(select visitor_id from chats)

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

Visitors.remove({
    last_update: {
        $lt: (new Date()).getTime() - 3600000 * 24 * 7
    }
}, function(error){

});
4

2 回答 2

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 } } );
于 2013-07-30T08:04:05.750 回答
2

因此,每个聊天都有一个字段visitor_id,并且您只想删除_id未在聊天中显示为 a的访问者visitor_id?您必须遍历所有访问者,检查last_activity每个访问者,如果它是删除的候选者,请find()与该访问者的_id. 如果没有发现任何文件,您可以删除该访问者。

当您遍历所有访问者时,您可以使用 MongoDB 游标( a 的结果find())来执行此操作。游标的实现方式是,您可以在迭代它时从基础集合中安全地删除文档。

诀窍是您不要试图在一次remove()调用中表达所有内容。作为迭代的一部分,您进行迭代、检查和删除。您想通过在聊天集合上添加索引来确保find()循环内部非常快。visitor_id

于 2013-07-30T02:32:35.333 回答