talbe名称:server_groups,例如有下面两条数据,字段iplist是一个数组。里面存储了多个范围,我想要查询一个数字是否落在这个范围内,如果说我查询150,就落在第一条记录的,第一个数组里面,那么就返回第一条记录。我查询750就落在第二条记录的,第二个数组里面。这个该怎么写查询语句啊?求教 { name:“111”, iplist:[ { “start” : 100, “end” : 200 }, { “strat” : 500, “end” : 700 } ] }, { name:“111”, iplist:[ { “start” : 300, “end” : 400 }, { “strat” : 800, “end” : 1000 } ] }
笨办法,全部查出来用js处理,
来自酷炫的 CNodeMD
@newBird01 刚接触mongo没有其他方法么。太慢了啊,或者存储的时候,不这么存?
db.dbname.find(
iplist.start:{
$lt: 150
}
iplist.end: {
$gt: 150
}
)
不一定对,你可以看看mongo中关于数组嵌套对象的查询的文档。
@BengBu-YueZhang 谢谢,这样不行啊。这样查询不是 { “start” : 100, “end” : 200},按照数组元素整体查询的,查询出来是不行的。
设计数据结构的时候 就不应该这样设计
看起来有点麻烦…不知道文档的API能不能解决,楼主要是解决的话可以分享一下,要是我就转sql了。
@hewentaowx 请教该怎么设计啊?
@HobaiRiku 好像没有什么方法呢,你有什么好的想法没
@snowwolf1 实在不行就只能查出来自己设计算法过滤出来咯,暂时没有空去研究mongo的文档,但是如果是换成sql,你可以把它设计成多表关系,这样sql就很好满足你的需求
有个本办法就是先unwind,拆开数组,然后match
@2linziyi2 麻烦具体说说呢。
用elemMatch
操作符
var x = 150;
db.getCollection('server_groups').find({
iplist: {
$elemMatch: {
start: {
$lte: x
},
end: {
$gt: x
}
}
}
})
@snowwolf1 建议去看一下mongodb高级查询聚合,这个用来处理数据比较常用的 楼下elemMatch的方式更好,这里就不具体说我的方式了
传送门 elemMatch https://blog.csdn.net/shiyaru1314/article/details/68496642 unwind https://docs.mongodb.com/manual/reference/operator/aggregation/unwind/