2017-04-05 52 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 } } },  
])