我有以下收藏
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 :(得分: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的图书。