2016-08-18 52 views
2

在我的项目中,我有一个搜索栏,用户可以在其中搜索其他用户。如何知道一个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错误。

我认为是$和和和$或者是问题,因为技术上最后是一个真实的,我不知道是否有解决方法。

我错过了这里的明显吗?

回答

相关问题