首页 > 代码库 > MongoDB 操作手册CRUD查询

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.inventory.find(
{
‘memos.memo‘: ‘on time‘,
‘memos.by‘: ‘shipping‘
}
)//匹配memos数组中某个元素包含memo字段且值为on time,同时另一个元素包含by字段且值为shipping的记录,或者某个元素同时满足两条记录

MongoDB 操作手册CRUD查询