如何访问Text Score MongoDB $ text search

时间:2016-08-24 16:26:27

标签: node.js mongodb mongoose mongodb-query text-search

我成功地在Node.js代码中使用Mongoose运行$ text搜索。这是我使用的代码:

Model.find( 
     { $text : { $search : "FindThisString"}},
     { score : {$meta : "textScore"}}
  )
 .sort({ score : { $meta : 'textScore'}})
 .exec(function(err, results) {
     _.each(results, function(item) {
        //console.log(item);
        console.log(item._id);
        console.log(item.score);
     });
});

当我控制台记录整个文档时,我可以看到"得分"控制台上的字段,但" item.score"打印为" undefined"。

如何在返回的结果中访问MongoDB创建的分数?

2 个答案:

答案 0 :(得分:3)

好吧我明白了......需要做的事情如下:

的console.log(item._doc.score);

那就行了!

答案 1 :(得分:1)

Model.find()返回mongoose Document而不是普通的Javascript对象。我猜想当您尝试访问属性“ score”时,会发生某种形式的验证,并且由于您的架构中没有该验证,它会返回undefined

我认为,获取item.score值的最佳方法是将猫鼬Document对象转换为纯Javascript对象。

为此,您可以使用{ lean: true }选项使Model.find()返回普通对象(有关更多信息,请参见herehere):

Model.find( 
  { $text : { $search : "FindThisString"}},
  { score : {$meta : "textScore"}},
  { lean: true }
)
.sort({ score : { $meta : 'textScore'}})
.then( (result) => {
  result.forEach(item => console.log(item.score));
});

或者(如果您需要猫鼬文档用于其他目的),则可以使用Document.prototype.toObject()方法获得纯JavaScript对象:

Model.find( 
  { $text : { $search : "FindThisString"}},
  { score : {$meta : "textScore"}}
)
.sort({ score : { $meta : 'textScore'}})
.then( (result) => {
  result.forEach(itemDocument => {
    const item = itemDocument.toObject();
    console.log(item.score);
  });
});