CNode

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

问答
Ssnowwolf1发布于8 年前最后回复8 年前14 回复4227 浏览0 收藏

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)

N
newBird01#1·8 年前

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

来自酷炫的 CNodeMD

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

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

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

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

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

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

H
hewentaowx#6·8 年前

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

H
HobaiRiku#7·8 年前

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

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

@hewentaowx 请教该怎么设计啊?

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

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

2
2linziyi2#11·8 年前

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

S
snowwolf1#12·8 年前
S
shen100#13·8 年前

elemMatch操作符

var x = 150;
db.getCollection('server_groups').find({
    iplist: {
        $elemMatch: {
            start: {
                $lte: x
            },
            end: {
                $gt: x
            }
        }
    }
})
2
2linziyi2#14·8 年前
引用 snowwolf1@2linziyi2 麻烦具体说说呢。

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

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

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