求教一个mongo数组查询的问题?
发布于 6 年前 作者 snowwolf1 2735 次浏览 来自 问答

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 } ] }

14 回复

笨办法,全部查出来用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/

回到顶部