MongoDB下根据数组大小进行查询的方法_MongoDB

注意:作者使用的mongodb版本为2.4.7。

首先插入测试数据

复制代码 代码如下:

db.data.insert({name:'a', num:[12,123,22,34,1]});
db.data.insert({name:'b', num:[42,22]});
db.data.insert({name:'c', num:[49]});

键num对应的值是数组。

查询num的数组值具有指定大小的document

最好的方法是使用$size,例如指定大小为2,可以:

复制代码 代码如下:

db.data.find({num:{$size:2}})

不过$size有一个缺陷,就是无法查询某个范围的大小,例如下面的语句是无法按照预期运行的:

复制代码 代码如下:

db.data.find({num:{$size:{$gt:2}}}); //错误

官方文档中建议,如果需要查询的数组大小在某个范围,可以另外为每个文档添加一个键来保存当前数组的大小。

如果数组大小是某个范围

另外两种思路,第一个思路是使用$where,例如如果要求数组大小小于3:

复制代码 代码如下:

db.data.find({ $where: "this.num.length < 3" })

这种方法具有很大的灵活性,但是速度会慢一些。

关于$where,请参考官方文档:http://docs.mongodb.org/manual/reference/operator/query/where/。

另外一个比较高效的方法是判断数组中的某个指定索引的元素是否存在,例如如果要求数组大小小于3:

复制代码 代码如下:

db.data.find({ "num.2": {$exists:0} })

数组大小小于3,就意味着num[2]不存在。

如果要求数组大小大于3,可以:

复制代码 代码如下:

db.data.find({ "num.3": {$exists:1} })

时间: 2024-08-01 08:34:26

MongoDB下根据数组大小进行查询的方法_MongoDB的相关文章

mongodb 内嵌数组大小

问题描述 mongodb 内嵌数组大小 需要一个很简单的功能,就是获取数组大小.例如有这样数据: { "name":"test", "arr":[{"num":0},{"num":1},{"num":2}] } 然后我再次插入数据时候,需要获取一下arr这个数组的长度.实现类似这样的功能: update({},{ $addToSet:{"arr": {"nu

ASP下的简洁的多重查询的方法与函数 真不错_应用技巧

ASP简洁的多重查询的解决方案 复制代码 代码如下: 'subject 信息标题  'company 发布信息的公司名称  'content 发布信息的内容  'address 公司地址  'infomation 公司简介  'note 相关说明  以上值均由FORM提交,然后通过:subject=trim(Request.Form("subject"))等得到相应的值.  <%  '这个函数很关键!---------------------------  Function sq

asp下去除数组中重复项的方法_应用技巧

复制代码 代码如下: <%Function MoveR(Rstr) Dim i,SpStr SpStr = Split(Rstr,",") For i = 0 To Ubound(Spstr) If I = 0 then MoveR = MoveR & SpStr(i) & "," Else If instr(MoveR,SpStr(i))=0 and i=Ubound(Spstr) Then MoveR = MoveR & SpStr

ASP下的简洁的多重查询的方法与函数 真不错

ASP简洁的多重查询的解决方案 复制代码 代码如下: 'subject 信息标题  'company 发布信息的公司名称  'content 发布信息的内容  'address 公司地址  'infomation 公司简介  'note 相关说明  以上值均由FORM提交,然后通过:subject=trim(Request.Form("subject"))等得到相应的值.  <%  '这个函数很关键!---------------------------  Function sq

asp下去除数组中重复项的方法

复制代码 代码如下:<%Function MoveR(Rstr) Dim i,SpStr SpStr = Split(Rstr,",") For i = 0 To Ubound(Spstr) If I = 0 then MoveR = MoveR & SpStr(i) & "," Else If instr(MoveR,SpStr(i))=0 and i=Ubound(Spstr) Then MoveR = MoveR & SpStr(

MongoDB教程之查询操作实例_MongoDB

1.  基本查询:     构造查询数据.   复制代码 代码如下:     > db.test.findOne()     {          "_id" : ObjectId("4fd58ecbb9ac507e96276f1a"),          "name" : "stephen",          "age" : 35,          "genda" : &qu

C++ 定义数组大小问题

一般情况下VC++编译的程序一个线程的栈的大小默认为1M(其他的编译器定义的栈大小也不会很大),定义数组大小 比如 int a[1000][1000]; 的时候就会出错,大小有1000*1000*4 = 3.8M,当然会发生栈溢出错误. 解决的办法很简单,将这个大的数组放到其他地方即可,比如可以将这个数组放到静态存储区(定义为全局或静态static的),或者放到堆上(用new或malloc等等实现) 另外,在编译器中修改默认栈大小也可解决这个问题(但不推荐) 例: //在堆上创建1000*100

c++ 数组大小问题

问题描述 c++ 数组大小问题 在c++中,怎么样比较两个数组元素的大小,并按从小到大的顺序一起输出来. 解决方案 如果是数字,比较大小直接比好了.如果是字符串,用strcmp,如果是别的,根据要求比较. 至于排序,冒泡.快速.选择.插入多了去了,也可以用现成的qsort等函数. 这样的代码google下大把. 解决方案二: 用vector存放数组,用成员函merge将两个函数融合,再sort成员函数融合即可 解决方案三: C++ 定义数组大小问题c++中类的大小问题C++中类的大小问题 解决方

c语言-二维数组大小问题......

问题描述 二维数组大小问题...... int a[100][100] = { 0 }, b[100] = {0}, n, m, j, i, min; printf("输入行和列: "); scanf_s("%d%d", &n, &m); for (i = 1; i <= n; i++) for (j = 1; j <= m; j++) scanf_s("%d", &a[i][j]); for (i = 1;