2016-04-19 5 views
2

私は3つのコレクションを持っている:mongodbでのコレクションに参加するには?

collection1は次のようである:

{ "_id" : ObjectId("5716617f4af77ca97a9614bd"), "count" : 1, "author" : "Tony" } 
{ "_id" : ObjectId("5716617f4af77ca97a9614be"), "count" : 2, "author" : "Joe"} 
{ "_id" : ObjectId("5716617f4af77ca97a9614bf"), "count" : 3, "author" : "Mary" } 
{ "_id" : ObjectId("5716617f4af77ca97a9314bf"), "count" : 2, "author" : "Lee" } 

は、著者トニーは1冊の本を書き込ん意味、作者ジョーはメアリーが3冊の本を書く書き込ん2冊の本と著者を書き込みます。

コレクション2は次のようである:

{ "_id" : ObjectId("5716617f4af77ca97a9614bd"), "count" : 2, "author" : "Tony" } 
{ "_id" : ObjectId("5716617f4af77ca97a9614be"), "count" : 2, "author" : "Joe"} 

は、著者トニーは2本の論文を書き意味、作者ジョーは Collection3が似ている2つの論文を書いている:私は著者がcollection3に表示され、ソート得ることを期待

{ "_id" : ObjectId("5716617f4af77ca97a9614bd"), "author" : "Tony" } 
{ "_id" : ObjectId("5716617f4af77ca97a9614be"), "author" : "Joe"} 
{ "_id" : ObjectId("5716617f4af77ca97a9624be"), "author" : "Mary"} 

これらの著者は作品数で のようになります。

author number: 
Joe  2 + 2 = 4 
Tony  1 + 2 = 3 
Mary  3 + 0 = 3 

これをmongodbで完了するにはどうすればよいですか?

+0

? – BanksySan

+0

@BanksySanバージョン3.2.4 – testcode

答えて

0

これは3.2以降でのみ機能します。

db.books.aggregate([{ 
    $lookup: { 
     from: "papers", 
     localField: "author", 
     foreignField: "author", 
     as: "papers" 
    } 
}, { 
    $unwind: "$papers" 
}, { 
    $group: { 
     _id: "$author", 
     bookCount: {$sum: "$count"}, 
     papersCount: {$sum: "$papers.count"}, 
    } 
}, { 
    $project: { 
     _id: 0, 
     author: "$_id", 
     total: { $add: [ "$bookCount", "$papersCount"] } 
    } 
}]) 

出力:モンゴのバージョンを使用している

/* 1 */ 
{ 
    "author" : "Tony", 
    "total" : 3 
} 

/* 2 */ 
{ 
    "author" : "Joe", 
    "total" : 4 
} 
+0

しかし、私はこれが作者がコレクション3にいることを確認できないと思います。 – testcode

+0

いいえ、データの一貫性は別の仕事です。モンゴはそれを強制しません。その第3のコレクションを何に使いたいですか?あなたはそれを集約する必要はありません。 – BanksySan

+0

たとえば、 "Joe"はコレクション3にはなく、最終結果は{"author": "Tony"、 "total":3}でなければなりません。 – testcode

関連する問題