我有两个系列,“消息”& “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")
})
答案 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帮助您加入'两个基于指定字段的集合。欢迎您使用它。