如果字段有多个结果,则MongoDB返回

时间:2017-04-05 14:38:32

标签: mongodb mongodb-query

我有以下收藏

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)的查询,但我不知道如何在这种情况下使用它。

2 个答案:

答案 0 :(得分:0)

这需要一个聚合操作,您需要通过ISBN $group 输入文档(在本例中为集合中的所有文档),添加额外的组内的字段(使用 $push ),这是一个包含该字段的列表 每个组的 $$ROOT 文档和表示计数的其他字段(使用累加器 $sum )。

使用 $match 的下一个管道应该过滤count字段上的分组结果。

考虑运行以下聚合管道以获得所需的结果:

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

答案 1 :(得分: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的图书。