查询操作 基本查询 查询指定集合中的所有记录 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的记录。 尽管可
查询操作基本查询查询指定集合中的所有记录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(:)中,将改为匹配的内嵌记录即可
例: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的记录,或者某个元素同时满足两条记录