2017-01-09 109 views
0

我有websites其中包含2个文件:MongoDB的聚合计算平均并将其添加到文档

{ 
    "_id" : ObjectId("58503934034b512b419a6eab"), 
    "website" : "https://www.stackoverflow.com", 
    "name" : "Stack Exchange", 
    "keywords" : [ 
     "helping", 
     "C#", 
     "PYTHON" 
    ] 
} 

{ 
    "_id" : ObjectId("58503934034b512b419a6eab"), 
    "website" : "https://www.google.com.com", 
    "name" : "Stack Exchange", 
    "keywords" : [ 
     "search", 
     "engine", 
    ] 
} 

我也有另外一个seo_tracking其中包含:

{ 
    "_id" : ObjectId("587373d6f6325811c8a0b3ad"), 
    "position" : "2", 
    "real_url" : "https://www.stackoverflow.com", 
    "created_at" : ISODate("2017-01-09T11:28:22.104Z"), 
    "keyword" : "helping" 
}, 
{ 
    "_id" : ObjectId("587373d6f6325811c8a0b3ad"), 
    "position" : "4", 
    "real_url" : "https://www.stackoverflow.com", 
    "created_at" : ISODate("2017-01-09T11:28:22.104Z"), 
    "keyword" : "C#" 
} 

等。这周围包含100 +文件

我想要做的是聚合seo_trackingwebsite在特定的URL((websites)将匹配www.stackoverflow.comseo_tracking)),我可以做得很好。不过,我想回每个websites以下:

{ 
    "_id" : ObjectId("587373d6f6325811c8a0b3ad"), 
    "website":"https://www.stackoverflow.com", 
    "avg_position" : "2" 
} 

那么对于谷歌等。即使avg_position是0 ..我曾尝试以下:

db.seo_tracking.aggregate([ 

    { 
     $lookup: 
     { 
      from: "websites", 
      localField: "real_url", 
      foreignField: "website", 
      as: "post_websites" 
     }, 
    }, 
    { 
     "$group": { 
      _id:null, 
      avg_position:{$avg:"$position"} 
      } 
     } 
]) 

然而,这只是生产:

{ 
    "_id" : null, 
    "avg_position" : 2.0 
} 

我需要做的是website和理想还需要ID

任何想法,我要去哪里错了吗?

+0

'$ avg'适用于数值,而一些你的位置值是字符串。 – chridam

+0

@chridam如果我将“n/a”更改为“0”,可以工作吗? – Phorce

+0

只要字段解析为数字,那么您将得到正确的平均值。 – chridam

回答

1

你可以尝试这样的事情。你需要$unwind从加入收藏访问领域和更改您的分组键从加入收藏使用_id获得平均每个网站:

db.seo_tracking.aggregate([{ 
    $lookup: { 
     from: "website", 
     localField: "real_url", 
     foreignField: "website", 
     as: "post_websites" 
    }, 
}, { 
    $unwind: "$post_websites" 
}, { 
    "$group": { 
     _id: "$post_websites._id", 
     avg_position: { 
      $avg: "$position" 
     }, 
     website: { 
      $first: "$real_url" 
     } 
    } 
}]) 
+0

感谢您的回复。问题是我得到:'找到0条记录(s)'取下'$ unwind'给了我1个值回到'https:// www.stackoverflow.com'并计算出了'https: //www.google.com ..哪里应该有2个收藏集返回..“https:// www.stackoverflow.com”的平均值和“https:// www.google.com”的收藏集只有最新的版本? – Phorce

+0

。看看它是否有帮助。 – Veeram

+0

没有这样的运气。仍然用'$ unwind'返回0结果 – Phorce