我尝试使用mongodb 3.4,nodejs和socket.io实现全文搜索,并使用distinct和sort。到目前为止这么好,我有这个代码工作正常,但没有排序部分:
socket.on('searchProductName', function (data) {
MongoClient.connect(config.database.url, function (err, db) {
db.collection(config.database.collection.products).distinct('productName',
{
$text: {$search: data}}, {score: {$meta: "textScore"}
},
function (err, doc) {
socket.emit('searchProductNameResults', doc);
db.close();
});
});
});
我试图找到一种基于textScore排序方法使用它的方法,但是对于不同的值:
db.collection.find(
<query>,
{ score: { $meta: "textScore" } }
).sort( { score: { $meta: "textScore" } } )
有什么想法吗?
谢谢
答案 0 :(得分:1)
使用汇总框架中的 aggregate()
功能,充分利用text search within the $match
, $sort
和 { {3}} 管道运营商将帮助您实现目标
期望的结果。
例如,以下管道使用 $group
运算符作为初始步骤,并包含 $match
操作。分数可以是 $text
管道规范的一部分,前面的管道 $sort
会创建按分数排序的不同值,使用< strong> $group
运营商:
socket.on('searchProductName', function (data) {
MongoClient.connect(config.database.url, function (err, db) {
var pipeline = [
{
"$match": {
"$text": {
"$search": data
}
}
},
{ "$sort": { "score": { "$meta": "textScore" } } },
{
"$group": {
"_id": null,
"products": { "$addToSet": "$productName" }
}
}
];
db.collection(config.database.collection.products)
.aggregate(pipeline, function (err, docs) {
socket.emit('searchProductNameResults', docs[0].products);
db.close();
}
);
});
});