我们的 React 应用程序有一个实时搜索,该搜索连接到包含 25 万个人姓名的 MongoDB 集合。在击键时,实时搜索使用正则表达式来抓取集合中的前 20 个文档。我们为 Live Search 获取数据的路径很简单,如下所示:
router.get('/live-search/text/:text', function (req, res) {
let text = req.params.text;
let queryFilters = { label: { $regex: `${text}`, $options: 'i' } };
db.gs__ptgc_selects.find(queryFilters).limit(20)
.then(data => res.json(data))
.catch(err => res.status(400).json('Error: ' + err))
});
Run Code Online (Sandbox Code Playgroud)
我确定我们的集合有文本索引,它是在label列上设置的。这是我们的 MongoDB Atlas 页面的屏幕截图,如下所示:
问题是该索引似乎不起作用。每当使用我们应用程序的实时搜索时(一直如此),我继续收到电子邮件警告Query Targeting: Scanned Objects / Returned has gone above 1000。我已经检查了这些查询的 MongoDB Atlas Profiler,并且(我认为)确认没有使用索引:
我错过了什么吗?很难从中创建一个完全可重现的示例。我们一直在努力使用 MongoDB 文本索引并将其与我们的实时搜索一起使用。
也许我需要使用$search,就像在这里完成的一样:https : //docs.mongodb.com/manual/text-search/。我目前正在使用 进行字符串匹配regex,但没有使用 …
聚合查询:
db.events.aggregate([
{$match: { "generated_at": {
"$gte": new Date(2017, 0, 1),
"$lte": new Date(2017, 3, 1)
}, game_id: ObjectId("59de213e9c43f70001c29bef"), event_type: "session"}},
{$project: { generated_at: "$generated_at", user_device_id: "$user_device_id",
avg_user_session_duration: {
$avg: "$session_duration"
}
}},
{$group: { _id: {day: { $dayOfMonth: "$generated_at"}, month: {$month: "$generated_at"}, year: { $year: "$generated_at"} },
avg_session_duration_per_user: {
$avg: "$avg_user_session_duration"
}
}},
{$sort: {"_id.year": 1, "_id.month": 1, "_id.day": 1}}
])
Run Code Online (Sandbox Code Playgroud)
索引:
{
"v" : 2,
"key" : {
"generated_at" : 1,
"game_id" : 1,
"event_type" : 1,
"impression_type" …Run Code Online (Sandbox Code Playgroud) aggregate bigdata mongodb aggregation-framework mongodb-atlas