MongoDB 操作手册CRUD查询

查询操作

基本查询

查询指定集合中的所有记录

db.testData.find()或者db.testData.find({});

相等条件查询

db.testData.find({num:5});//查询num=5的记录

使用查询操作符声明多个条件

db.testData.find({num:{$in:[2,3,4]}});查询num为2,3,4的记录。
尽管可以使用$or操作符来执行同样的查询,但是当多个or条件都是在同一字段上的相等判断时,请使用$in而不是$or。

and条件查询

db.testData.find({name:'d',num:{$lt:10}});//查询name为d且num小于10的记录。lt = less than

or条件查询

db.find({$or:[{name:'a'},{num:{$gt:3}}])//查询name为a或者num大于3的记录。gt = greater than

and or 混合查询

db.testData.find({gender:'male',$or:[{name:'a'},{age:{$gt:3}}]});//查询gender为male,且(名字为a或者age>3)的记录。


嵌入型记录查询

当一个字段内嵌了一条记录,查询时既可以声明精确的(即字段顺序,字段值都匹配)去匹配内嵌记录某些字段,或者使用“.”来匹配内嵌记录的各个字段声明。

测试数据

db.testData.insert( { producer:{company:'a',address:'123'},name:'aaa' } );
db.testData.insert( { producer:{company:'a',address:'123'} } );

精确匹配内嵌记录的某字段

原来的db.testData.find(<field>:<value>)中,将<value>改为匹配的内嵌记录即可
例:db.testData.find( { producer:{company:'a',address:'123'} } );
结果将返回以上两条测试数据
注意:
db.testData.find( { producer:{address:'123',company:'a'} } )
db.testData.find( { producer:{address:'123',name:'aaa'} } )
db.testData.find( { producer:{company:'a',name:'aaa'} } )

这三条语句都不会查询到结果,即这种查询方式必须从是从第一到第n个字段的匹配,字段顺序颠倒,或者不是挨着的都不会查到结果。

匹配某些内嵌字段

db.testData.find( { 'producer.company':'a' } );
db.testData.find( { 'producer.company':'a','producer.address':'123' } );

以上两条可以查询到所有测试数据。
注意:
db.testData.find( { 'producer.company':'a','producer.name':'aaa' } );
db.testData.find( { 'producer.address':'123','producer.name':'aaa' } );
db.testData.find( { 'producer.name':'aaa' } );

这三条语句也无法查询到测试数据,也就是说这种方式也必须是从第一到第n个字段的匹配,字段顺序,或者不是挨着的字段都不会查到结果

数组

概述

当某个字段保存数组,可以根据数组中的某个值来查询这条记录。如果这个数组保存着嵌入型记录,可以使用“.”查询。
如果使用$elemMatch声明多个条件来进行查询,数组必须至少包含一条记录满足所有条件。
如果没有使用$elemMatch来声明多个条件进行查询,那么满足条件的记录符合的条件是:这个数组中的各个元素能够覆盖条件的每个要求,如数组5,6,7,条件为=5且=7的情况下,数组中的5和7两个元素组合起来能够覆盖所有条件要求。

测试数据

db.testData.insert({ _id: 5, type: "food", item: "aaa", ratings: [ 5, 8, 9 ] });
db.testData.insert({ _id: 6, type: "food", item: "bbb", ratings: [ 5, 9 ] });
db.testData.insert({ _id: 7, type: "food", item: "ccc", ratings: [ 9, 5, 8 ] });


精确匹配数组

查询结果需要精确匹配数组中的每个值,包括每个元素的顺序

db.testData.find( { ratings: [ 5, 8, 9 ] } )

匹配数组中的一个值

db.testData.find( { ratings: 5 } )

匹配数组指定位置的值

db.testData.find( { 'ratings.0': 5 } )//匹配ratings数组中第一个元素为5的记录

数组的多条件查询

单元素条件查询

db.testData.find( { ratings: { $elemMatch: { $gt: 5, $lt: 9 } } } )//匹配ratings数组中至少有一个元素既大于5又小于9的记录。

多元素联合匹配查询

db.testData.find( { ratings: { $gt: 5, $lt: 9 } } )//匹配数组中有一个元素大于5,同时有另一个元素小于9的记录,或者某个元素同时满足这两个条件的记录。

嵌入型记录数组

测试数据

{
_id: 100,
type: "food",
item: "xyz",
qty: 25,
3.3. MongoDB CRUD Tutorials 91
MongoDB Documentation, Release 2.6.4
price: 2.5,
ratings: [ 5, 8, 9 ],
memos: [ { memo: "on time", by: "shipping" }, { memo: "approved", by: "billing" } ]
}
{
_id: 101,
type: "fruit",
item: "jkl",
qty: 10,
price: 4.25,
ratings: [ 5, 9 ],
memos: [ { memo: "on time", by: "payment" }, { memo: "delayed", by: "shipping" } ]
}

使用数组下标匹配嵌入型记录的某个字段

如果你知道嵌入型记录的数组顺序,可以用以下查询
db.testData.find( { 'memos.0.by': 'shipping' } )//匹配memos数组中第一元素的by字段为shipping的记录

无需数组下标匹配字段

不知道数组顺序的情况下,用以下查询
db.testData.find( { 'memos.by': 'shipping' } )//匹配memos数组中某个元素包含by字段且值为shipping的记录

数组的多条件查询

和数组查询一样,使用$elemMatch就是要数组中的某个元素满足所有条件,不用的话就是多个元素组合起来满足所有条件

单元素条件查询

使用$elemMatch来查询数组中某个元素满足所有的记录
db.testData.find({memos:{$elemMatch:{memo: 'on time',by: 'shipping'}}});//匹配memos中某个元素既有memo为'on time'又有by为 'shipping'的记录

组合满足条件查询

db.testData.find( { 'memos.memo' : 'on time','memos.by' :  'shipping' });

//匹配memos数组中某个元素包含memo字段且值为on time,同时另一个元素包含by字段且值为shipping的记录,或者某个元素同时满足两条记录

设置查询结果包含的字段

概述

格式:<field>: <1 or true>//显示某个字段
 <field>: <0 or false>//不显示某个字段
默认情况下查询显示_id字段。若不需要显示需要显式声明_id:0
不能把一个字段既声明为1又声明为0,如db.testData.find({},{_id:0,_id:1}),像这样设置查询字段有冲突的时候,查询结果将只返回所有记录的_id。

查询符合条件的记录的所有字段

没有声明投影字段,查询将返回所有字段
db.testData.find({type:'food'});

查询所需字段和_id字段

db.testData.find({type:'food'},{item:1});//查询结果将返回所有包含type为food的记录的_id和item字段

查询指定字段

db.testData.find({type:'food'},{item:1,_id:0});//查询结果将只返回type为food记录的item字段

数组投影

对于包含数组的字段,投影操作有以下操作符:$elemMatch,$slice,$
例:db.testData.find({_id:5},{ratings:{$slice:2}});//查询_id为5的记录的所有字段,但是ratings字段只取前两个值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值