2017-01-24 5 views
0

MongoDBサーバーに大量のデータを含むプロジェクトを継承しました。私はそれのためのいくつかのクエリを書いているとかなり迷惑な問題に遭遇した。 IDという固有の値の数を見つける必要があります。問題は、このデータの起源に応じて2つの異なる点で現れることです。残念ながら、私はこれでデータをモデルし直すことはできませんMongoDB:2つの異なるテーブルから別個のカウントを取得する

{ 
    foo: { 
    ID: "ABC123" 
    }, 
    bar: { 
    ID: undefined 
    } 
} 

または

{ 
    foo: { 
    ID: undefined 
    }, 
    bar: { 
    ID: "ABC123" 
    } 
} 

または

{ 
    foo: { 
    ID: "ABC123" 
    }, 
    bar: { 
    ID: "ABC123" 
    } 
} 

たとえば、表には、このようなものを見ることができますポイント。私はMongoDBの知識がかなり限られています。これらを一緒に結合する集約を使用する方法があるかどうか疑問に思っています。そのため、すべてのIDが単一のドキュメントにまとめられ、すべてが一意になります。どちらか一方をグループ化するのはかなり簡単ですが、両方をグループ化すると重複が生じます。

答えて

5

$project、次に$group、次に$addToSetを使用できます。

db.c.aggregate([ 
{ 
    $project : { 
     _id : 0, 
     IDS : ["$foo.ID", "$bar.ID"] 
    } 
}, 
{ 
    $unwind : "$IDS" 
}, 
{ 
    $group : { 
     _id : 1, 
     distinctIds : { 
      $addToSet : "$IDS" 
     } 
    } 
} 
]) 
2

あなたは配列に各barID'sfooドキュメントを取得し、以前にグループ化ID's間で明確な得るために$setUnionを介してそれらを実行するために$groupを試すことができます。

db.collection.aggregate({ 
    $group: { 
     "_id": null, 
     "ID": { 
      $addToSet: { 
       "foo_id": "$foo.ID", 
       "bar_id": "$bar.ID" 
      } 
     } 
    } 
}, { 
    $project: { 
     "ID": { 
      $setUnion: ["$ID.foo_id", "$ID.bar_id"] 
     }, 
     _id: 0 
    } 
}) 
+0

これも機能します。ありがとうございました。 – DeeV

関連する問題