我使用 Mongodb 和我的数据库模式,如下所示:
firstName: 'vahid',
lastName: 'kh',
age: 12
我想找到名字+姓氏喜欢'vahid kh'的所有记录。在 SQL 中,这将是:
Select * from table where firstName + lastName like '%vahid kh%'
我使用 Mongodb 和我的数据库模式,如下所示:
firstName: 'vahid',
lastName: 'kh',
age: 12
我想找到名字+姓氏喜欢'vahid kh'的所有记录。在 SQL 中,这将是:
Select * from table where firstName + lastName like '%vahid kh%'
似乎这仅在今天发布的 2.4 中可用。
> db.temp.save({ "firstName" : "Bob", "lastName" : "Smith", Age : 12 });
> db.temp.find();
{ "_id" : ObjectId("5148a2a00477cddcdece1b34"), "firstName" : "Bob", "lastName" : "Smith", "Age" : 12 }
> db.temp.aggregate({ $project : { "name" : { $concat : [ "$firstName", " ", "$lastName" ] } } });
{
"result" : [
{
"_id" : ObjectId("5148a2a00477cddcdece1b34"),
"name" : "Bob Smith"
}
],
"ok" : 1
}
你可以使用$regex
,这样你就可以使用部分匹配。像这样的东西:
db.collection.find( { field: /acme.*corp/i } )
这是与 php 中的答案有些相似的问题:MongoRegex and search multiple rows in collection
关于 mongoregex 的文档在这里:http ://docs.mongodb.org/manual/reference/operator/regex/
编辑:
我刚刚在 sql 中使用查询阅读了您的评论。简单的解决方案可能是创建字段fullname
并使用 搜索它$regex
,这是一种数据库非规范化,您可以在其中存储一些冗余数据。
甚至更简单,这也应该可以完成工作:
db.collection.find( { firstName: /*vahid/i, lastName: /kh*/i } )
要搜索两个或多个字段的组合,您需要使用聚合框架。它允许您按字段组合进行排序,并且您不需要存储(非规范化)任何额外的字段:
db.collection.aggregate([
{
$match: {
// Optional criteria to select only some documents to process, such as...
deleted: null
}
},
{
$addFields: {
// Need to prefix fields with '$'
fullName: { $concat: [ "$firstName", "$lastName" ] },
}
},
{
$search: { fullName: /.*vakid kh.*/ },
}
]);
解释:
fullName
通过连接名字和姓氏来创建字段$search
执行正则表达式 search,这是 MongoDB 等价于 SQLLIKE
运算符。我在 expressjs 代码聚合中的代码有点慢然后找到,所以我使用基于条件和使用正则表达式来查找真实结果,我正在与您分享 nodejs 代码,希望它对您或我的其他代码爱好者朋友有用。
router.get('/publisher/:q',function(req,res){
var q = ucfirst( req.params['q'] );
var qSplit = q.split(" ");
var db = mongojs(CONNECTION_STRING, ['tags_helper','users']);
var query = { "status" : 1, isAdmin : { $exists : false } };
console.log(qSplit);
if( qSplit.length > 1 )
{
query["firstName"] = new RegExp(qSplit[0],"i");
query["lastName"] = new RegExp(qSplit[1],"i");
}
else
{
qSplit[0] = new RegExp(qSplit[0],"i");
qSplit[1] = new RegExp(qSplit[0],"i");
//query.push( { $or : [ {"firstName": new RegExp(q,"i")},{"lastName": new RegExp(q,"i")} ] } );
query["$or"] = [ {"firstName": new RegExp(q,"i")},{"lastName": new RegExp(q,"i")} ];
}
db.users.find( query,{_id : 1,firstName:1,lastName:1,image:1,profileName:1}).limit(10,function (err, users) {
//TODO your further code ..
});
});
祝您编码愉快。