0

我有两个集合,“消息”和“对话映射”。消息是单个电子邮件消息的集合。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")
})
4

1 回答 1

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

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

然而

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

这应该返回所有孤立的会话映射,但是对于您的数据,它似乎不起作用。可能是我使用了错误的复制方式,但这个查询会为你解决问题。

解释: $lookup 帮助您基于指定字段“加入”两个集合。欢迎您使用它来玩耍。

于 2017-02-06T20:17:45.860 回答