结合2个单独的结果mongo db

时间:2017-02-09 05:14:19

标签: mongodb mongodb-query

我正在使用MongoDb开发基于电子商务的网站。

在我的db集合中,我有两种类型的文档

  1. 公司详情项目

    { doc_type : 'company', name : 'Acer', type : 'Laptops', helpline : '1800-200-000' }

  2. 项目详情

    {doc_type : "item", item_id : 1001, price : 2000, discount : 20}

  3. 现在在产品页面中,我需要从两个文档中获取数据。

    所以,首先我运行

    db.collection.find({doc_type:'item', item_id : 1001 });
    

    显示产品数据然后

     db.collection.find({doc_type:'company', name: "Acer"});
    

    获取公司数据。

    他们是否可以将这两个调用减少到一个并在单个结果集中获取数据。

    {
     company : { //company data},
     item : { //item details }
    }
    

2 个答案:

答案 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
}