加入相当于两个MongoDB集合

时间:2017-02-06 18:39:50

标签: mongodb join schemaless

我有两个系列,“消息”& “ConversationMappings”。消息是各个电子邮件的集合。 ConversationMappings是一个消息的集合,它们是一个会话线程的一部分。

我有很多孤立的“ConversationMappings”,我试图删除,所以我试图找到并删除没有消息的ConversationMappings。

我有999条消息和20,000多个ConversationMappings,我必须删除999条消息集合中没有消息的所有ConversationMappings。这将是关系中的一个简单连接....但我不知道如何在MongoDB中这样做

收集架构

**Message**
({
    "created_at": ISODate("2016-10-05T14:04:31.690-07:00"),
    "account_id": "579f7b64144a99xxxxxx81d94db",
    "from": {
        "name": "Joe Emailer",
        "email": "p1@mydomain.com"
    },

    "message": "Text of the message",
    "timestamp": ISODate("2015-06-16T12:40:55.322-07:00"),
    "to": {
        "name": "Jane Emailer",
        "email": "p2@mydomain.com"
    },
    "updated_at": ISODate("2016-10-05T14:04:31.690-07:00")
})

**ConversationMapping**
 ({
    "archived": false,
    "messages": [
        "5xxxxxxxxxxxxx81d94db",
        "5xxxxxxxxxxxxx81d94dc",
        "5xxxxxxxxxxxxx81d94dd",
        "5xxxxxxxxxxxxx81d94de"
    ],
    "account_id": "579f7b64144a99xxxxxx81d94db",
    "participants": [
        "p1@mydomain.com",
        "p2@mydomain.com"
    ],
    "timestamp": ISODate("2014-07-24T17:00:00.000-07:00")
})

1 个答案:

答案 0 :(得分:0)

db.message.aggregate([
   {
      $lookup:
         {
            from: "conversationMapping",
            localField: "account_id",
            foreignField: "account_id",
            as: "orphaned_docs"
        }
   },
   {
      $match: { "orphaned_docs": { $ne: [] } }
   }
])

上面的查询将为您提供所有非孤立的conversationMappings。一旦你拥有了所有有效的converstionMappings,你就可以将它们转储到新的集合中并摆脱旧的。

然而

db.message.aggregate([
   {
      $lookup:
         {
            from: "conversationMapping",
            localField: "account_id",
            foreignField: "account_id",
            as: "orphaned_docs"
        }
   },
   {
      $match: { "orphaned_docs": { $eq: [] } }
   }
])

这应该返回所有孤立的conversationMappings,但不知何故,你的数据似乎无法正常工作。可能是我使用错误的方式复制它,但这个查询将为你做到这一点。

说明:$ lookup帮助您加入'两个基于指定字段的集合。欢迎您使用它。