Mongodb 将两个单独的结果合并到mongo db中
我正在使用Mongodb 将两个单独的结果合并到mongo db中,mongodb,mongodb-query,Mongodb,Mongodb Query,我正在使用MongoDb开发一个基于电子商务的网站 在我的数据库集合中,我有两种类型的文档 公司详情项目 {doc_类型:'公司', 名称:‘宏碁’, 类型:“笔记本电脑”, 求助热线:“1800-200-000” } 项目详细信息 {doc\u type:“项目”, 项目编号:1001, 价格:2000, 折扣:20} 现在在产品页面中,我需要从两个文档中获取数据 所以,我先跑 db.collection.find({doc_type:'item', item_id : 1001 }); 显
MongoDb
开发一个基于电子商务的网站
在我的数据库集合中,我有两种类型的文档
{doc_类型:'公司',
名称:‘宏碁’,
类型:“笔记本电脑”,
求助热线:“1800-200-000”
}
{doc\u type:“项目”,
项目编号:1001,
价格:2000,
折扣:20}
db.collection.find({doc_type:'item', item_id : 1001 });
显示产品数据,然后
db.collection.find({doc_type:'company', name: "Acer"});
获取公司数据
是他们将这两个调用减少为一个并在单个结果集中获取数据的任何方法
像
您可以通过使用
$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
}
您可以通过使用
$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
}
为了实现您共享的示例输出,以及
$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
}
}
为了实现您共享的示例输出,以及
$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
}
}
聚合是数据的永久更改还是每次用户请求时生成?@atulquest93否,这不会更改您集合中的数据。每次运行queythanks时都会生成它!还有一点疑问,这会影响性能吗?就像每次我们将一个系列与另一个系列合并一样。。或者当集合包含超过3-4行lac时?就像在我的例子中一样,它们可以是来自特定公司的1个lac项目。@atulquest93实际上不是合并集合,而是合并文档。这不是一个连接(我们将使用$lookup),而是一个分组。由于在管道的开头有一个$match,所以$group阶段只适用于少数文档,所以应该非常快。你应该试试看解释,更好地了解它的性能。。是否意味着,
$lookup
将对文档结构进行永久性更改?所以,如果数据应该在文档中定期更新,那么分组是最好的选择,否则$lookup
。对吗?聚合是数据的永久更改还是每次用户请求时生成的?@atulquest93否,这不会更改您集合中的数据。每次运行queythanks时都会生成它!还有一点疑问,这会影响性能吗?就像每次我们将一个系列与另一个系列合并一样。。或者当集合包含超过3-4行lac时?就像在我的例子中一样,它们可以是来自特定公司的1个lac项目。@atulquest93实际上不是合并集合,而是合并文档。这不是一个连接(我们将使用$lookup),而是一个分组。由于在管道的开头有一个$match,所以$group阶段只适用于少数文档,所以应该非常快。你应该试试看解释,更好地了解它的性能。。是否意味着,$lookup
将对文档结构进行永久性更改?所以,如果数据应该在文档中定期更新,那么分组是最好的选择,否则$lookup
。是吗?这会影响性能吗?因为items表包含3-40万条记录。。。有时公司数据需要与50-60k项目记录合并?不,这不会影响性能。由于我们使用的是管道的$match
阶段,因此很少有文档会被转入下一个级别。如果您面临内存问题,请尝试使用值为true的$allowDiskUse
。这是否会影响性能,因为items表包含300-400万条记录。。。有时公司数据需要与50-60k项目记录合并?不,这不会影响性能。由于我们使用的是管道的$match
阶段,因此很少有文档会被转入下一个级别。如果遇到内存问题,请尝试使用值为true的$allowDiskUse
。