当我尝试在mongodb中进行文本搜索时,我的查询返回一个空数组。我已经在数据库中创建了索引。
例如:
我有2种数据类型的String在模型状态中声明,而mac_address都已包含在文本索引中。当我搜索mac_address时,它为我提供了正确的数据,但是当我尝试搜索状态时,它返回了一个空数组。
--Model--
const PhoneSchema = new mongoose.Schema({
status: {
type: String,
default: "DOWN"
},
mac_address: {
type: String,
unique: true
},
});
--Index--
db.phones.createIndex({
status: "text",
mac_address: "text"
});
--Route--
router.get('/search/:searchForData',
async function (req, res) {
try {
const searchPhone = await Phone.find({
$text: {
$search: req.params.searchForData
}
}, {
score: {
$meta: "textScore"
}
}).sort({
score: {
$meta: "textScore"
}
})
res.status(200).json(searchPhone);
} catch (err) {
return res.status(404).json({
error: err.message
});
}
});
db.phones.getIndexes()
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "pingphony.phones"
},
{
"v" : 2,
"unique" : true,
"key" : {
"ip" : 1
},
"name" : "ip_1",
"ns" : "pingphony.phones",
"background" : true
},
{
"v" : 2,
"unique" : true,
"key" : {
"mac" : 1
},
"name" : "mac_1",
"ns" : "pingphony.phones",
"background" : true
},
{
"v" : 2,
"key" : {
"_fts" : "text",
"_ftsx" : 1
},
"name" : "$**_text",
"ns" : "pingphony.phones",
"weights" : {
"$**" : 1
},
"default_language" : "english",
"language_override" : "language",
"textIndexVersion" : 3
}
]
我希望/ phone / search / DOWN的输出是包含DOWN状态的数据,但是我得到的实际输出是[]
答案 0 :(得分:0)
尝试直接从mongo控制台进行查询:
db.phones.find({$ text:{$ search:“ DOWN”}})
尝试使用聚合管道:
const searchPhone =等待Phone.aggregate( [ {$ match:{$ text:{$ search:“ DOWN”}}}, {$ sort:{分数:{$ meta:“ textScore”}}}, ] );
如果您尝试了所有操作,但都无法顺利进行,请尝试使用regexp:
const searchQuery = req.params.searchForData.replace(/ [。* +?^ $ {}()| [] \] / g,'\ $&'); //转义正则表达式符号
const searchPhone = await Phone.find({status:new RegExp(${searchQuery}
,'i')});