我们正在尝试查找推文是正面还是负面
我们的数据库中有两个集合:第一个集合重新组合了单词列表,以及它们是肯定的还是否定的
第二个是推文列表
我们的要求是:
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是tweet集合,inf是单词集合。
我们无法理解为什么它总是计数为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"
中取消引用第一个数组元素,但它似乎不起作用(我认为我已经做过一次)。