我正在使用MongoDb
开发基于电子商务的网站。
在我的db集合中,我有两种类型的文档
公司详情项目
{ doc_type : 'company',
name : 'Acer',
type : 'Laptops',
helpline : '1800-200-000'
}
项目详情
{doc_type : "item",
item_id : 1001,
price : 2000,
discount : 20}
现在在产品页面中,我需要从两个文档中获取数据。
所以,首先我运行
db.collection.find({doc_type:'item', item_id : 1001 });
显示产品数据然后
db.collection.find({doc_type:'company', name: "Acer"});
获取公司数据。
他们是否可以将这两个调用减少到一个并在单个结果集中获取数据。
像
{
company : { //company data},
item : { //item details }
}
答案 0 :(得分:3)
为了实现您已共享的示例输出,以及$match
和$group
阶段,我添加了$project
阶段。
db.col.aggregate([
{
$match:
{
$or: [
{doc_type:'item', item_id : 1001 },
{doc_type:'company', name: 'Acer'}
]
}
},
{
$group:
{
_id: null,
"company_name": {$max: "$name"},
"company_type": {$max: "$type"},
"company_helpline": {$max: "$helpline"},
"item_price": {$max: "$price"},
"item_discount": {$max: "$discount"}
}
},
{
$project:
{
_id: 0,
'company' : {
'name': '$company_name',
'type': '$company_type',
'helpline': '$company_helpline',
},
'item' : {
'price': '$item_price',
'discount': '$item_discount'
}
}
}
]).pretty()
输出:
{
"company" : {
"name" : "Acer",
"type" : "Laptops",
"helpline" : "1800-200-000"
},
"item" : {
"price" : 2000,
"discount" : 20
}
}
答案 1 :(得分:1)
您可以使用$match
和$group
阶段使用聚合来实现此目的。
查询将是:
db.it.aggregate([
{$match:
{$or: [
{doc_type:'item', item_id : 1001 },
{doc_type:'company', name: "Acer"}
]
}
},
{$group:
{_id: null,
"compagny_name": {$max: "$name"},
"compagny_type": {$max: "$type"},
"compagny_helpline": {$max: "$helpline"},
"item_price": {$max: "$price"},
"item_discount": {$max: "$discount"}
}
}] )
此输出:
{
"_id":null,
"compagny_name":"Acer",
"compagny_type":"Laptops",
"compagny_helpline":"1800-200-000",
"item_price":2000,
"item_discount":20
}