2017-02-06 2 views
0

"Messages" & "ConversationMappings"という2つのコレクションがあります。メッセージは個々の電子メールメッセージの集合です。 ConversationMappingsは、1つの会話スレッドの一部であるメッセージの集合です。は2つのMongoDBコレクションに相当するものです

私は削除しようとしている孤立した「ConversationMappings」がたくさんあるので、メッセージを持たないConversationMappingsを見つけて削除しようとしています。

私は999個のメッセージと20,000以上の会話マッピングを持っており、999メッセージのコレクションにメッセージを持たないすべての会話マッピングを削除する必要があります。これは、単純なリレーショナルに参加でしょう....が、私はコレクションのスキーマ

**Message** 
({ 
    "created_at": ISODate("2016-10-05T14:04:31.690-07:00"), 
    "account_id": "579f7b64144a99xxxxxx81d94db", 
    "from": { 
     "name": "Joe Emailer", 
     "email": "[email protected]" 
    }, 

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

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

答えて

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

は、上記のクエリはあなたにすべての非を与える

MongoDBの

でそれを行う方法がわかりません孤立した会話マッピング。すべての有効なconverstionマッピングがあれば、それらを新しいコレクションにダンプして古いものを取り除くことができます。

しかし

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

これはすべての孤立conversationMappingsを返す必要がありますが、どういうわけか、あなたのデータのためにそれが動作していないようです。私はそれを複製する間違った方法を使用することがありますが、このクエリはあなたのためのトリックを行います。

説明:$ lookupは、指定したフィールドに基づいて2種類のコレクションを結合するのに役立ちます。あなたはそれを使用して遊ぶことを歓迎します。

+0

私はこれが好きです...しかし、私のデータモデルではそれが意味をなさないと思います。 account_idは、ConversationMappings&Messagesの両方の外部フィールドです。フィールド "messages"にはmessage_idsの配列が格納されています(最初は間違ったカラム名を使用しました)。 – NothingToSeeHere

+0

は、基本的に両方のコレクションに存在するフィールドを使用できます。 (名前は異なりますが、同じ値を持つ必要があります)。したがって、conversationMapping内のmessage_id配列がmessage_idをメッセージコレクションに格納している場合は、それを使用することもできます。詳しくは、このリンクを参照してください。https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/ –

関連する問題