我们正在尝试查找推文是正面还是负面
我们的数据库中有两个集合:第一个集合重新组合了单词列表,以及它们是肯定的还是否定的
第二个是推文列表

我们的要求是:

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"中取消引用第一个数组元素,但它似乎不起作用(我认为我已经做过一次)。

10-08 14:09