2017-04-05 65 views
0

我有以下收集MongoDB的回報領域擁有不止一個結果

db.createCollection("BOOK", {TITLE : String, AUTHOR : String, ISBN : Number, 
PUBLISHER: { NAME : String, 
    DATE : Date, 
    CITY : String, 
     ADDRESS: [{ STREET : String, 
       CITY : String , 
        ZIP : Number , 
        STATE : String , 
        COUNTRY : String }]}, 
AVAILABLE: Boolean, 
PAGES : Number , 
LANGUAGE : String }) 

隨着一本書的數據與兩個出版商:

db.BOOK.insert({TITLE : 'Southern Lights', AUTHOR : 'Danielle Steel', ISBN : 303041974, 
PUBLISHER: { NAME : 'Random House', 
    DATE : new Date("Apr 23,2002"), 
    CITY : 'New York', 
     ADDRESS: { STREET : ['1475 Broadway','375 Hudson Street'], 
       CITY : 'New York' , 
        ZIP : [10019 ,10014], 
        STATE : 'New York' , 
        COUNTRY : 'US' } }, 
AVAILABLE: 'Y', 
PAGES : 2042 , 
LANGUAGE : 'English' }) 

db.BOOK.insert({TITLE : 'Southern Lights', AUTHOR : 'Danielle Steel', ISBN : 303041974, 
PUBLISHER: { NAME : 'Penguin Publishers' , 
    DATE : new Date("Jan 19,1998"), 
    CITY : 'New York', 
     ADDRESS: { STREET : '140 Broadway', 
       CITY : 'New York' , 
        ZIP : 10013, 
        STATE : 'New York' , 
        COUNTRY : 'US' } }, 
AVAILABLE: 'Y', 
PAGES : 2042 , 
LANGUAGE : 'English' }) 

如果我想檢索書籍的所有信息有多個發佈者(比如上面的結果),我應該使用哪個查詢?我知道有一個大於($ gt)的查詢,但我不確定如何在這種情況下使用它。

回答

0

我會用下面的聚合框架管道:

db.BOOK.aggregate([ 
{ 
    $group: { _id: { TITLE : "$TITLE", AUTHOR : "$AUTHOR", ISBN : '$ISBN' }, publishers: { $addToSet: '$PUBLISHER'} }} 
}, 
{ 
    $unwind:"$publishers" 
}, 
{ 
    $group: { _id: "$_id", publisherCount: { $sum:1} } 
}, 
{ 
    $match: {publisherCount: { $gte:2} } 
} 
]); 

它把ISBN作爲一個唯一的標識符一本書,然後爲每本書建立一套出版商。然後統計每本書的出版商,並僅返回出版商數量大於或等於2的那些圖書。

+0

因此,這將返回所有擁有多個發佈商的圖書的所有信息? – salivad

+0

通過所有的信息,你的意思是書的細節?另外,它們對於具有相同ISBN的書籍是否一定是相同的? –

+0

我修改了我的示例以返回所有字段 –

0

這需要一個聚合操作,由此就需要$group輸入文檔由ISBN鍵(在這種情況下,所有的集合中的文件),組(使用$push)中添加一個額外的域,是一個列表,其中包含表示計數的每個組和另一個字段的文檔(使用累加器$sum$sum)。

使用下一個管線$match應過濾來自count字段上的分組的結果。


考慮運行下面的總管道,以獲得期望的結果:

db.BOOK.aggregate([ 
    { 
     "$group": { 
      "_id": "$ISBN", 
      "books": { "$push": "$$ROOT" }, 
      "count": { "$sum": 1 } 
     } 
    }, 
    { "$match": { "count": { "$gt": 1 } } },  
])