我成功地在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创建的分数?
答案 0 :(得分:3)
好吧我明白了......需要做的事情如下:
的console.log(item._doc.score);
那就行了!
答案 1 :(得分:1)
Model.find()返回mongoose Document而不是普通的Javascript对象。我猜想当您尝试访问属性“ score”时,会发生某种形式的验证,并且由于您的架构中没有该验证,它会返回undefined
。
我认为,获取item.score
值的最佳方法是将猫鼬Document对象转换为纯Javascript对象。
为此,您可以使用{ lean: true }
选项使Model.find()返回普通对象(有关更多信息,请参见here和here):
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);
});
});