NoSQL多条件查询并不难,关键在于理解结构
很多人用关系型数据库习惯了SQL的WHERE条件拼接,一转到NoSQL就懵了。比如在MongoDB里查“年龄大于25、城市是北京、且职业是程序员”的用户,没法直接写SELECT……WHERE……AND。但其实只要摸清NoSQL的查询逻辑,多条件组合反而更灵活。
以MongoDB为例,它的查询语法本身就是JSON格式,多个条件默认就是“与”(AND)关系。比如下面这个查询:
db.users.find({
age: { $gt: 25 },
city: "北京",
job: "程序员"
})这行代码就能精准命中目标数据。看起来像在写JavaScript对象,上手快,调试也方便。
需要“或”条件?用$or操作符就行
如果想查“城市是北京或者上海的用户”,就得用$or。比如:
db.users.find({
$or: [
{ city: "北京" },
{ city: "上海" }
]
})还可以和其他条件混用。比如查“北京或上海的程序员,年龄大于30”:
db.users.find({
$or: [
{ city: "北京" },
{ city: "上海" }
],
job: "程序员",
age: { $gt: 30 }
})这里要注意:$or之外的条件会作用于整个结果集,相当于“先或后与”。
嵌套字段也能查,点号 notation 很好用
实际项目中,数据往往是嵌套的。比如用户信息里有个address字段:
{
name: "小李",
address: {
city: "深圳",
district: "南山"
}
}要查“住在深圳南山区的用户”,直接用点号:
db.users.find({
"address.city": "深圳",
"address.district": "南山"
})这种写法简洁直观,特别适合处理JSON结构的数据。
模糊查询别忘了正则和索引
查名字带“张”的用户,可以用正则:
db.users.find({
name: /张/
})但正则查得慢,尤其数据量大时。建议对常用查询字段加索引,比如给name字段建个索引:
db.users.createIndex({ name: 1 })能明显提升查询速度。多条件查询时,复合索引更高效,比如经常按city和job一起查,就建个联合索引:
db.users.createIndex({ city: 1, job: 1 })索引不是越多越好,写多读少的场景要权衡利弊。
做后台管理系统的筛选功能时,用户常会组合各种条件。用NoSQL处理这类需求,结构灵活,扩展性强,只要理清查询逻辑,写起来比拼SQL字符串还清爽。