mongo二维数组操作
有2个嵌套的数组:
返回了查找到的记录,说明了查找有效果了:
这样查找返回的数据都是把匹配的整个文档返回过来了。
1、使用"$size"可以查询指定长度的数组
查询数组长度为3的数组db.users.find({"emails":{"$size":3}})
常见的查询是数组长度范围的查询."$size"并不能与其他查询子句组合(如:"$gt"),但是这种查询可以通过
在文档中添加一个"size"键的方式来实现.这样每一次向指定数组添加元素的时候,同时增加"size"值.原来这样
的更新: db.users.update({"$push":{"emails":"295240648@139.com"}})
变成这样的更新: db.users.update({"$push":{"emails":"295240648@139.com"},"$inc":{"size":1}})
这样就可以这样查询了 db.users.find({"size":{"$gt":3}})
2、使用"$slice"查询
find的第二个参数是可选的,可以指定返回那些键,"$slice"返回数组的一个子集合
返回emails数组的前两个元素 db.users.find({"userName":"refactor"},{"emails":{"$slice":2}})
返回emails数组的后两个元素 db.users.find({"userName":"refactor"},{"emails":{"$slice":-2}})
返回emails数组的第2个和第11个元素.如果数组不够11个,则返回第2个后面的所有元素
db.users.find({"userName":"refactor"},{"emails":{"$slice":[1,10]}})
"$slice"默认将返回文档中的所有键.
3、要正确指定一组条件,而不用指定每个键,要使用"$elemMatch".这种模糊的命名条件能用来部分指定匹配数组中
的单个内嵌文档的限定条件.正确写法应该是:
db.blog.find(
{
"comments":
{
"$elemMatch":
{
"author":"refactor",
"score":{"$gte":5}
}
}
}
)
"$elemMatch"将限定条件进行分组,仅当需要对一个内嵌文档的多个键操作时才会用到.
4."$where"查询
"$where"可以执行任意javascript作为查询的一部分.这使得查询能做(几乎)任何事情.
最典型的应用就是比较文档中的两个键的值是否相等.
如:db.blog.insert({"title":"refactor","content":"refactor"})
db.blog.insert({"title":"refactor1","content":"refactor content"})
第一个文档title键和content键的值相同.要返回该文档.
db.blog.find(
{
"$where":function()
{
for(var current in this)
{
for(var other in this)
{
if(current!=other&&this[current]==this[other])
{
return true;
}
}
}
return false;
}
}
)
如果函数返回true,文档就作为结果的一部分被返回.
上面是用一个函数,也可以用一个字符串指定"$where"查询.下面两种方式是等价的:
db.blog.find({"$where":"this.x+this.y==10"})
db.blog.find({"$where":"function(){return this.x+this.y==10;}"})
不是非常必要时,应避免"$where"查询.它在速度上要比常规查询慢的多.每个文档都要从BSON转换成
javascript对象,然后通过"$where"的表达式来运行.它还不能利用索引.
将常规查询作为前置过滤,与"$where"组合使用才能不牺牲性能,如果有可能的话,用索引根据非"$where"
子句进行过滤,"$where"只用于对结果进行调优
上面的4个查询转自:http://www.cnblogs.com/refactor/archive/2012/07/30/2591344.html
http://www.cnblogs.com/refactor/archive/2012/07/31/2591544.html
mongo二维数组操作的更多相关文章
- python的二维数组操作
需要在程序中使用二维数组,网上找到一种这样的用法: ? 1 2 3 4 5 6 #创建一个宽度为3,高度为4的数组 #[[0,0,0], # [0,0,0], # [0,0,0], # [0,0,0] ...
- 06-01 Java 二维数组格式、二维数组内存图解、二维数组操作
二维数组格式1 /* 二维数组:就是元素为一维数组的一个数组. 格式1: 数据类型[][] 数组名 = new 数据类型[m][n]; m:表示这个二维数组有多少个一维数组. n:表示每一个一维数组的 ...
- 整理:python的二维数组操作
Python中初始化一个5 x 3每项为0的数组,最好方法是: multilist = [[0 for col in range(5)] for row in range(3)] 如果初始化一个二维数 ...
- python的二维数组操作--坑
用到python list的二维数组,发现有一些需要注意的地方. 第一种赋值方法: list0 = [[0]*3]*4 list0[0][1] = 1 print(list0) 输出结果为: [[0, ...
- 在python中定义二维数组
发表于 http://liamchzh.0fees.net/?p=234&i=1 一次偶然的机会,发现python中list非常有意思. 先看一段代码 [py]array = [0, 0, 0 ...
- php对二维数组进行相关操作(排序、转换、去空白等)
php对二维数组进行相关操作(排序.转换.去空白等) 投稿:lijiao 字体:[增加 减小] 类型:转载 时间:2015-11-04 这篇文章主要介绍了php对二维数组进行相关操作,包括php对 ...
- C++使用VARIANT实现二维数组的操作
C++使用VARIANT实现二维数组的操作 VARIANT变量是COM组件之间互相通信的重要的参数变量之一,它可以容纳多种不同的类型,如short.long.double等,包括各类指针和数组.组件之 ...
- [java学习笔记]java语言基础概述之数组的定义&常见操作(遍历、排序、查找)&二维数组
1.数组基础 1.什么是数组: 同一类型数据的集合,就是一个容器. 2.数组的好处: 可以自动为数组中的元素从零开始编号,方便操作这些数据. 3.格式: (一 ...
- 对二维数组使用指针进行操作的探索(C语言)
/* Name: 对二维数组使用指针进行操作的探索 Copyright: Author: lingr7 Date: 01/12/18 11:55 Description: */ #include< ...
随机推荐
- CentOS下安装LNMP(LINUX+NGINX+MYSQL+PHP)环境
一.安装Nginx最新版 首先查看是否有安装源包 yum list nginx (或yum info nginx) 如果没有则 vi /etc/yum.repos.d/nginx.repo #添加如 ...
- 禁止 PC端打开网页 进行跳转
try {var urlhash = window.location.hash;if (!urlhash.match("fromapp")){if ((navigator.user ...
- 15)Java &和&&
&,双目运算符:将两个表达式的值按二进制位展开,对应的位(bit)按值进行"与"运算,结果保留在该位上- 比如170&204对应二进制就是 1010101 ...
- delphi中表示跳出的有break,continue, exit,abort, halt, runerror
1.break 强制退出循环(只能放在循环中),用于从For语句,while语句或repeat语句中强制退出. 2.continue 用于从For语句,while语句或repeat语句强行结束本次 ...
- asp.net解析请求报文
NameValueCollection myHeader = new NameValueCollection(); int i; string strKey; string result; myHea ...
- MarkDown写作技巧
前言 年轻的我们往往苦恼于没有充实的社会经历.社会阅历,很难有较强的个人能力.个人魅力!就个人能力而言,本 人主要把它分为两种:“吸收能力”和“输出能力”.吸收能力主要体现了个人对外界知识的摄入能力, ...
- jquery mobile最棘手的一个问题
大多数jquery mobile开发的妹子们都碰到过这个问题: 如何调用loading效果 这里给出一段代码,赶紧练手吧. //显示loading function showLoading(){ ...
- c语言结构体保存并输出学生信息
最近在学习数据结构,巩固下c语言. #include<stdio.h> /*定义结构体student并设置别名stud*/ /*typedef struct student{ int nu ...
- 说说oracle中的面向对象与面向集合
这一篇算是对近期自己学习的一个心得总结 一.oracle的面向对象 SQL是面向集合的这个大家都知道,但是不可否认现在的oracle中有很多地方都体现着面向对象的思维.(这也算是各大语言殊途同归的一个 ...
- quartz集群调度机制调研及源码分析---转载
quartz2.2.1集群调度机制调研及源码分析引言quartz集群架构调度器实例化调度过程触发器的获取触发trigger:Job执行过程:总结:附: 引言 quratz是目前最为成熟,使用最广泛的j ...