MongoDB聚合加入

时间:2015-09-13 11:30:10

标签: mongodb join mongodb-query aggregation-framework

在MongoDB数据库中,我有两个集合。一个引用另一个id字符串。

收藏集sessions包含一个字段session-id,另一个字段active

集合visits包含字段session-id。多次访问是指一次会议。

我想删除active为假的所有会话,这是一项简单的任务,但也是所有访问每个已删除会话的访问。

由于MongoDB中没有JOIN语句,如何选择应该使用一个命令删除的所有访问?

可以通过聚合完成吗?

2 个答案:

答案 0 :(得分:2)

这个怎么样?

// unordered bulk operations because basically we have 
// decoupled operations anyway
var bulkVisits = db.sessions.initializeUnorderedBulkOp()

// first, we need all inactive session IDs
var inactive_sessions = db.sessions.find({"active":"false"},{_id:1})

inactive_sessions.forEach(
  function(session){

    // queue the removal of visits which refer to inactive sessions...
    bulkVisits.find({"session-id":session._id}).remove();

  }
)

// ...execute the removal operations...
bulkVisits.execute()
// and remove the inactive sessions
db.sessions.remove({"active":"false"})

答案 1 :(得分:0)

这可以在聚合中完成

db.sessions.aggregate([ 
            $lookup :  {
                  from"visits",localField:"session-id", 
                  foreignField :"session-id",as : "},
{
$match : {"active" : true}}
])

删除你得到的结果