跳到主要内容
CNode

求教一个mongo数组查询的问题?

问答
Ssnowwolf1发布于 8 年前最后回复 8 年前
1442670

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)

2
2linziyi2#148 年前
引用 snowwolf1@2linziyi2 麻烦具体说说呢。

@snowwolf1 建议去看一下mongodb高级查询聚合,这个用来处理数据比较常用的 楼下elemMatch的方式更好,这里就不具体说我的方式了

传送门 elemMatch https://blog.csdn.net/shiyaru1314/article/details/68496642 unwind https://docs.mongodb.com/manual/reference/operator/aggregation/unwind/

S
shen100#138 年前

elemMatch操作符

var x = 150;
db.getCollection('server_groups').find({
    iplist: {
        $elemMatch: {
            start: {
                $lte: x
            },
            end: {
                $gt: x
            }
        }
    }
})
S
snowwolf1#128 年前
2
2linziyi2#118 年前

有个本办法就是先unwind,拆开数组,然后match

H
HobaiRiku#108 年前
引用 snowwolf1@HobaiRiku 好像没有什么方法呢,你有什么好的想法没

@snowwolf1 实在不行就只能查出来自己设计算法过滤出来咯,暂时没有空去研究mongo的文档,但是如果是换成sql,你可以把它设计成多表关系,这样sql就很好满足你的需求

S
snowwolf1#88 年前
引用 hewentaowx设计数据结构的时候 就不应该这样设计

@hewentaowx 请教该怎么设计啊?

H
HobaiRiku#78 年前

看起来有点麻烦...不知道文档的API能不能解决,楼主要是解决的话可以分享一下,要是我就转sql了。

H
hewentaowx#68 年前

设计数据结构的时候 就不应该这样设计

S
snowwolf1#58 年前
引用 BengBu-YueZhang不一定对,你可以看看mongo中关于数组嵌套对象的查询的文档。

@BengBu-YueZhang 谢谢,这样不行啊。这样查询不是 { “start” : 100, “end” : 200},按照数组元素整体查询的,查询出来是不行的。

B
BengBu-YueZhang#38 年前
db.dbname.find(
	iplist.start:{
		$lt: 150
	}
	iplist.end: {
		$gt: 150
	}
)

不一定对,你可以看看mongo中关于数组嵌套对象的查询的文档。

S
snowwolf1#28 年前
引用 newBird01笨办法,全部查出来用js处理, 来自酷炫的 CNodeMD

@newBird01 刚接触mongo没有其他方法么。太慢了啊,或者存储的时候,不这么存?

N
newBird01#18 年前

笨办法,全部查出来用js处理,

来自酷炫的 CNodeMD

参与回复

登录后即可参与回复。登录