在我的项目中,我有一个搜索栏,用户可以在其中搜索其他用户。如何知道一个mongodb查询有多少匹配
我正在使用MongoDB作为我的数据库引擎,并在我的服务器上使用nodeJS上的猫鼬,至此一切正常,除了一件事情之外,我想按相关性排序结果。
可以想象我有这个集合
{
"nombre" : "Ramiro",
"apellido" : "Garcilazo",
"empresa" : "PEMEX",
"tamano" : "Grande(250+)",
"sector" : "Servicios",
"giro" : "Sustancias Químicas",
"actividad" : "Venta de petroquimicos",
"estado" : "Jalisco"
}
{
"nombre" : "Luis",
"apellido" : "Alberto",
"empresa" : "GanaMex",
"tamano" : "Mediana (51-250)",
"sector" : "Construccion",
"giro" : "Agricultura, Ganaderia y Pesca",
"actividad" : "Graneros",
"estado" : "Aguascalientes"
}
{
"nombre" : "Ramon",
"apellido" : "Corona",
"empresa" : "CoronMex",
"tamano" : "Micro (1-10)",
"sector" : "Construccion",
"giro" : "Textiles, Prendas y Productos de Cuero",
"actividad" : "Venta de tiendas de campaña",
"estado" : "Ciudad de mexico"
}
{
"nombre" : "Joe",
"apellido" : "Doe",
"empresa" : "Apple inc",
"tamano" : "Micro (1-10)",
"sector" : "Construccion",
"giro" : "Alimentos y Bebidas",
"actividad" : "Ejemplo",
"estado" : "Veracruz"
}
{
"nombre" : "John",
"apellido" : "Smith",
"empresa" : "Google inc",
"tamano" : "Micro (1-10)",
"sector" : "Bienes",
"giro" : "Agricultura, Ganaderia y Pesca",
"actividad" : "XYZ",
"estado" : "Aguascalientes"
}
{
"nombre" : "foo",
"apellido" : "bar",
"empresa" : "foobar inc.",
"tamano" : "Mediana (51-250)",
"sector" : "Servicios",
"giro" : "Alimentos y Bebidas",
"actividad" : "foo-bar",
"estado" : "Aguascalientes"
}
{
"nombre" : "Jonathan",
"apellido" : "Ceja",
"empresa" : "It4Pymes",
"tamano" : "Grande(250+)",
"sector" : "Bienes",
"giro" : "Mineria, Petroleó y Gas",
"actividad" : "asdf",
"estado" : "Baja California"
}
而我当前的查询看起来像这样
export function buscarProveedor(req, res) {
var regTerms = [];
//creates an RegExp array of all the terms the user searched
var terms = req.body.term.split(" ");
for (var i = 0; i < terms.length; i++) {
regTerms.push(new RegExp(terms[i], 'i'));
}
//creates a single RegExp for all the term
var regTerm = new RegExp(req.body.term, 'i');
User.find({
$and: [{
//any of this that matches
$or: [{
nombre: regTerm
}, {
empresa: regTerm
}, {
sector: {
$in: regTerms
}
}, {
giro: {
$in: regTerms
}
}, {
estado: {
$in: regTerms
}
}, {
actividad: {
$in: regTerms
}
}, {
tags: {
$in: regTerms
}
}]
}, {
//ignore this, just checks if is not another type of user
empresa: {
$exists: true
}
}, {
//checks that doesn't gets the user that made the query
_id: {
$ne: req.body.id
}
}]
}, '_id nombre empresa')
.then(user => {
//returns it to my front-end
res.json(user).end();
});
}
所以,例如在我的搜索栏,我把“Construccion”,他们的回应是
{
"_id": 0
"nombre" : "Luis",
"empresa" : "GanaMex"
}
{
"_id": 1
"nombre" : "Ramon",
"empresa" : "CoronMex",
}
{
"_id": 2
"nombre" : "Joe",
"empresa" : "Apple inc",
}
但是,如果我把“Construccion Textiles”,我会得到相同的确切结果,即使吨他id 1匹配到2个术语。
我想知道它有多少匹配,所以我可以通过相关性对它进行排序,在顶部找到更多匹配的匹配。
我可以实现与查询,或我必须操纵数据后,我真的不知道,我没有看到这个问题之前任何地方前。
谢谢。
编辑:好的,我用$匹配和$组要做到这一点,但仍然没有带做我想要什么,我用这个。
export function buscarProveedorAvansado(req, res) {
var regTerms = [];
var terms = req.body.term.split(" ");
for (var i = 0; i < terms.length; i++) {
regTerms.push(new RegExp(terms[i], 'i'));
}
var regTerm = new RegExp(req.body.term, 'i');
User.aggregate([{
$match: {
$and: [{
$or: [{
nombre: regTerm
}, {
empresa: regTerm
}, {
sector: {$in: regTerms}
}, {
giro: {$in: regTerms}
}, {
estado: {$in: regTerms}
}, {
actividad: {$in: regTerms}
}, {
tags: {$in: regTerms}
}]
}, {
empresa: {$exists: true}
}, {
_id: {
$ne: req.body.id
}
}]
}
}, {
$group: {
"_id" : "$_id",
"nombre" : {$max: "$nombre"},
"empresa": {$max: "$empresa"},
count: {
$sum: 1
}
}
}]).then(user => {
console.log(user);
res.json(user).end();
});
}
我使用术语“Construccion”
[{
"_id": 0
"nombre" : "Luis",
"empresa" : "GanaMex",
"count": 1
}
{
"_id": 1
"nombre" : "Ramon",
"empresa" : "CoronMex",
"count": 1
}
{
"_id": 2
"nombre" : "Joe",
"empresa" : "Apple inc",
"count": 1
}]
我再次得到完全相同的结果得到这样的结果,如果我使用的术语“Construccion纺织品”
我试着几件事情,在$总和上使用$ cond:
$sum:[{
$cond: {
if: {
nombre: regTerm
},
then: 1,
else: 0
}
}, {
$cond: {
if: {
empresa: regTerm
},
then: 1,
else: 0
}
}, {
$cond: {
if: {
sector: {
$in: regTerms
}
},
then: 1,
else: 0
}
}, {
$cond: {
if: {
giro: {
$in: regTerms
}
},
then: 1,
else: 0
}
}, {
$cond: {
if: {
giro: {
$in: regTerms
}
},
then: 1,
else: 0
}
}, {
$cond: {
if: {
estado: {
$in: regTerms
}
},
then: 1,
else: 0
}
}, {
$cond: {
if: {
nombre: regTerm
},
then: 1,
else: 0
}
}, {
$cond: {
if: {
nombre: regTerm
},
then: 1,
else: 0
}
}]
获取mongo错误。
我认为是$和和和$或者是问题,因为技术上最后是一个真实的,我不知道是否有解决方法。
我错过了这里的明显吗?
好的,我试图使用链接上的例子。 [PasteBin](http://pastebin.com/9DpuK4ZN),它给了我这个结果 '[{_id:null,count:3}]' 我怎样才能将每个文档分开并统计每一个匹配,你能帮助我吗? – Mockingguy