мы пытаемся выяснить, являются ли твиты положительными или отрицательными. В нашей базе данных есть две коллекции: первая перегруппирует список слов и положительные или отрицательные твиты, вторая - список твитов.
Наш запрос:
t.aggregate([{$project:{wordt:{$split:["$text"," "]}}},
{$lookup:{from:"infi",localField:"wordt",foreignField:"word",as:"test_word"}},
{$project:
{tpositif:
{$cond:[{$eq:["$test_word.polarity","positive"]},1,0]},
tnegatif:
{$cond:[{$eq:["$test_word.polarity","negative"]},1,0]}}},
{$group:{
_id:"$_id",
count_pos:{$sum:"$tpositif"},
count_neg:{$sum:"$tnegatif"}
}])
t - это коллекция твитов, а также коллекция слов.
Мы не можем понять, почему он всегда считает 0.
Спасибо за совет.
Вы тестируете "$test_word.polarity"
но test_word
является массивом.
Вы можете решить эту проблему, раскрутив поиск, который разделяет "соединенные" строки на их собственные строки верхнего уровня. Это не должно быть проблемой для вас, так как у вас должна быть только одна запись настроения на слово (иначе вы получите дубликаты).
t.aggregate([{$project:{wordt:{$split:["$text"," "]}}},
{$lookup:
{from:"infi",localField:"wordt",foreignField:"word",as:"test_word"}},
{$unwind:"$test_word"},
{$project:
{tpositif:
{$cond:[{$eq:["$test_word.polarity","positive"]},1,0]},
tnegatif:
{$cond:[{$eq:["$test_word.polarity","negative"]},1,0]}}},
{$group:{
_id:"$_id",
count_pos:{$sum:"$tpositif"},
count_neg:{$sum:"$tnegatif"}
}])
Хороший способ диагностики агрегатных запросов - это вернуть конвейер обратно в начальное предложение и посмотреть, соответствуют ли ожидаемые вами промежуточные коллекции документов. Затем добавьте пункты по одному.
например, сокращение его до двух пунктов выявляет проблему:
> db.tweets.aggregate([ {$project:{wordt:{$split:["$text"," "]}}}, {$lookup:{from:"infi",localField:"wordt",foreignField:"word",as:"test_word"}}, ]);
{ "_id" : ObjectId("5c59442c365f7243b44062f8"), "wordt" : [ "test", "1" ], "test_word" : [ { "_id" : ObjectId("5c594473365f7243b44062f9"), "word" : "test", "polarity" : "negative" } ] }
{ "_id" : ObjectId("5c59463fd56fd34fcc370c74"), "wordt" : [ "the", "infinite", "fool" ], "test_word" : [ { "_id" : ObjectId("5c594625d56fd34fcc370c73"), "word" : "fool", "polarity" : "positive" } ] }
{ "_id" : ObjectId("5c594657d56fd34fcc370c75"), "wordt" : [ "test", "the", "infinite", "fool" ], "test_word" : [ { "_id" : ObjectId("5c594473365f7243b44062f9"), "word" : "test", "polarity" : "negative" }, { "_id" : ObjectId("5c594625d56fd34fcc370c73"), "word" : "fool", "polarity" : "positive" } ] }
Здесь вы можете видеть, что "test_word": [ { "_id"...
это массив в квадратных скобках. Таким образом, свойство polarity
находится в первом элементе массива, а не в самом $test_word
.
КСТАТИ. Сначала я подумал, что вы можете разыменовать первый элемент массива в $eq
например, "$test_word[0].polarity"
но, похоже, он не работает (я думал, что сделал это один раз).