Node Mongodb .find返回奇怪的结果



嗨,我有一个客户端发送一个搜索字符串和服务器端代码搜索mongodb数据库的结果。

这是我的代码:

if (req.body.page < 0) req.body.page = 0;
findQuery = {_userId: req.body._userId};
if (req.body.query)
findQuery.name = {"$regex": new RegExp(req.body.query, 'i')};
const numResults = await companySchema.countDocuments(findQuery);

companySchema.find(findQuery).sort({ [req.body.sort]: [req.body.order] }).limit(req.body.results).skip(req.body.page * req.body.results).then(response => {
res.setHeader('Access-Control-Expose-Headers', 'NUMBER-RESULTS')
res.setHeader('NUMBER-RESULTS', numResults);
res.status(200).json( response );
})
}

我得到一些奇怪的结果。例如,如果我搜索"aaa"(即req.body.query是"aaa"),有一个命中,它返回一个正确的结果。

由于没有结果"aaaa"它返回一个空数组,并且一切正常。

但是,如果我搜索"aaaaa",它返回整个集合。如果我搜索&;aaaaaa"它返回零结果。当我继续添加额外的"a"时;到搜索字符串的末尾,它将随机返回0或所有结果。它会一直这样做。所以"aaaaa"将始终返回所有条目,并且"aaaaaa"将始终返回0个结果。

正确的行为应该是它总是返回0结果,因为任何超过"aaa"不应该在数据库中产生命中。

我输入了许多console.log语句和所有的请求。主体条目是正确的。甚至在相同的查找查询中,来自。countdocuments的numResults也会不断返回0个结果,但是相同的查询。find有时会在应该返回0个结果时任意返回所有结果。

你知道是什么原因造成的吗?

好吧,我知道是什么错了,但不知道为什么。对于特定长度的搜索字符串,const numResults = await companySchema.countDocuments(findQuery);行将修改我的findQuery变量。有时会,有时不会。

我采纳了注释中的建议,使用aggregate重写代码,然后还实现了$facet来计算总结果,并完全避免使用countDocuments函数。这是新的工作代码:

results = await companySchema.aggregate([
{
$match: findQuery
},
{
$sort: {
[req.body.sort]: Number(req.body.order)
}
},
{ $facet: {
results: [                
{
$skip: req.body.page * req.body.results
},
{
$limit: req.body.results
}
],
totalCount: [ {$count: 'count'}]
}}
], function (err, results) {
if (err) {
es.status(400).json({ message: "COMPANY_SEARCH_ERROR" });
}
else {     
if (results[0].totalCount[0] == undefined) {
returnResults = null;
numResults = 0;
}
else {
returnResults = results[0].results;
numResults = results[0].totalCount[0].count;
}
res.setHeader('Access-Control-Expose-Headers', 'NUMBER-RESULTS')
res.setHeader('NUMBER-RESULTS', numResults);
res.status(200).jsonp( returnResults );
}
});```

最新更新