2017-01-09 1 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_tracking с помощью website по определенному URL-адресу ().(в websites) будет соответствовать www.stackoverflow.com в (seo_tracking)), который я могу сделать хорошо. Тем не менее, я хотел бы вернуться для каждого из websites следующее:

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

Тогда для Google и т.д .. Даже если 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' работает на числовых значениях, и некоторые из ваши значения 'position' являются строками. – 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 записей (ы)' снятие '$ unwind' возвращает мне 1 значение для' https: // www.stackoverflow.com' и выдает среднее значение для 'https: //www.google.com .. Там, где должно быть возвращено 2 коллекции. Среднее значение для 'https: // www.stackoverflow.com' и коллекция для' https: // www.google.com' – Phorce

+0

только что обновлено , посмотрите, помогает ли это. – Veeram

+0

Нет такой удачи.Все еще возвращая 0 результатов с '$ unind' – Phorce