Вы тестируете "$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"
, но, похоже, он не работает (я думал, что сделал это один раз).