Node+Mongoose常用查询
Mongoose 模型提供了 find, findOne, 和 findById 方法用于文档查询。
Model.find
Model.find(query, fields, options, callback) // fields 和 options 都是可选参数
简单查询
Model.find({ 'csser.com': 5 }, function (err, docs) { // docs 是查询的结果数组 });
只查询指定键的结果
Model.find({}, ['first', 'last'], function (err, docs) {
// docs 此时只包含文档的部分键值
})
Model.findOne
与 Model.find 相同,但只返回单个文档
Model.findOne({ age: 5}, function (err, doc){
// doc 是单个文档
});
Model.findById
与 findOne 相同,但它接收文档的 _id 作为参数,返回单个文档。_id 可以是字符串或 ObjectId 对象。
Model.findById(obj._id, function (err, doc){
// doc 是单个文档
});
Model.count
返回符合条件的文档数。
Model.count(conditions, callback);
Model.remove
删除符合条件的文档。
Model.remove(conditions, callback);
Model.distinct
查询符合条件的文档并返回根据键分组的结果。
Model.distinct(field, conditions, callback);
Model.where
当查询比较复杂时,用 where:
Model
.where('age').gte(25)
.where('tags').in(['movie', 'music', 'art'])
.select('name', 'age', 'tags')
.skip(20)
.limit(10)
.asc('age')
.slaveOk()
.hint({ age: 1, name: 1 })
.run(callback);
Model.$where
有时我们需要在 mongodb 中使用 javascript 表达式进行查询,这时可以用 find({$where : javascript}) 方式,$where 是一种快捷方式,并支持链式调用查询。
Model.$where('this.firstname === this.lastname').exec(callback)
Model.update
使用 update 子句更新符合指定条件的文档,更新数据在发送到数据库服务器之前会改变模型的类型。
var conditions = { name: 'borne' }
, update = { $inc: { visits: 1 }}
, options = { multi: true };
Model.update(conditions, update, options, callback)
注意:为了向后兼容,所有顶级更新键如果不是原子操作命名的,会统一被按 $set 操作处理,例如:
var query = { name: 'borne' };
Model.update(query, { name: 'jason borne' }, options, callback)
// 会被这样发送到数据库服务器
Model.update(query, { $set: { name: 'jason borne' }}, options, callback)
查询 API
如果不提供回调函数,所有这些方法都返回 Query 对象,它们都可以被再次修改(比如增加选项、键等),直到调用 exec 方法。
var query = Model.find({});
query.where('field', 5);
query.limit(5);
query.skip(100);
query.exec(function (err, docs) {
// called when the `query.complete` or `query.error` are called
// internally
});
详情可以参考官方文档:
http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%7B%7Blimit%28%29%7D%7D
Mongodb一些常用的查询
WHERE查询
|
1
2
|
// i.e., select * from things where x=3 and y="foo"db.things.find( { x : 3, y : "foo" } ); |
j不等于3,k大于10
|
1
|
db.things.find({j: {$ne: 3}, k: {$gt: 10} }); |
存储数组元素
|
1
2
3
4
5
|
db.things.insert({colors : ["blue", "black"]})db.things.insert({colors : ["yellow", "orange", "red"]})//查询结果db.things.find({colors : {$ne : "red"}}){"_id": ObjectId("4dc9acea045bbf04348f9691"), "colors": ["blue","black"]} |
对比操作符
|
1
2
3
4
|
db.collection.find({ "field" : { $gt: value } } ); // greater than : field > valuedb.collection.find({ "field" : { $lt: value } } ); // less than : field < valuedb.collection.find({ "field" : { $gte: value } } ); // greater than or equal to : field >= valuedb.collection.find({ "field" : { $lte: value } } ); // less than or equal to : field <= |
$all 全部属于
|
1
|
db.things.find( { a: { $all: [ 2, 3 ] } } ) |
$exists 字段存在
|
1
2
3
|
db.things.find( { a : { $exists : true } } )db.things.find( { a : { $exists : false } } )true返回存在字段a的数据,false返回不存在字度a的数据。 |
$mod 取模运算
|
1
2
|
db.things.find( { a : { $mod : [ 10 , 1 ] } } )条件相当于a % 10 == 1 即a除以10余数为1的。 |
$ne 不等于
|
1
2
|
db.things.find( { x : { $ne : 3 } } )条件相当于x<>3,即x不等于3。 |
$in 属于
|
1
2
|
db.things.find({j:{$in: [2,4,6]}})条件相当于j等于[2,4,6]中的任何一个。 |
$nin 不属于
|
1
2
|
db.things.find({j:{$nin: [2,4,6]}})条件相当于 j 不等于 [2,4,6] 中的任何一个。 |
$or 或 (注意:MongoDB 1.5.3后版本可用)
|
1
2
|
db.foo.find( { $or : [ { a : 1 } , { b : 2 } ] } )符合条件a=1的或者符合条件b=2的数据都会查询出来。 |
$size 数量,尺寸
|
1
2
|
db.things.find( { a : { $size: 1 } } )条件相当于a的值的数量是1(a必须是数组,一个值的情况不能算是数量为1的数组)。 |
$type 字段类型
|
1
2
|
db.things.find( { a : { $type : 2 } } )条件是a类型符合的话返回数据。 |
limit() skip()
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
这两个ME想连起来讲,他们就是你实现数据库分页的好帮手。limit()控制返回结果数量,如果参数是0,则当作没有约束,limit()将不起作用。skip()控制返回结果跳过多少数量,如果参数是0,则当作没有约束,skip()将不起作用,或者说跳过了0条。例如: db.test.find().skip(5).limit(5)结果就是取第6条到第10条数据。snapshot() (没有尝试)count() 条数返回结果集的条数。db.test.count()在加入skip()和limit()这两个操作时,要获得实际返回的结果数,需要一个参数true,否则返回的是符合查询条件的结果总数。例子如下:> db.test.find().skip(5).limit(5).count()9> db.test.find().skip(5).limit(5).count(true)4 |
11) $elemMatch
|
1
2
3
4
5
6
7
8
9
|
如果对象有一个元素是数组,那么$elemMatch可以匹配内数组内的元素: t.find( { x : { $elemMatch : { a : 1, b : { $gt : 1 } } } } ) { "_id" : ObjectId("4b5783300334000000000aa9"), "x" : [ { "a" : 1, "b" : 3 }, 7, { "b" : 99 }, { "a" : 11 } ]}$elemMatch : { a : 1, b : { $gt : 1 } } 所有的条件都要匹配上才行。注意,上面的语句和下面是不一样的。 t.find( { "x.a" : 1, "x.b" : { $gt : 1 } } )$elemMatch是匹配{ "a" : 1, "b" : 3 },而后面一句是匹配{ "b" : 99 }, { "a" : 11 } |
12) 查询嵌入对象的值
|
1
2
3
4
5
6
7
8
9
10
11
|
db.postings.find( { "author.name" : "joe" } );注意用法是author.name,用一个点就行了。更详细的可以看这个链接: dot notation举个例子: db.blog.save({ title : "My First Post", author: {name : "Jane", id : 1}})如果我们要查询 authors name 是Jane的, 我们可以这样: db.blog.findOne({"author.name" : "Jane"})如果不用点,那就需要用下面这句才能匹配:db.blog.findOne({"author" : {"name" : "Jane", "id" : 1}})下面这句:db.blog.findOne({"author" : {"name" : "Jane"}})是不能匹配的,因为mongodb对于子对象,他是精确匹配。 |

浙公网安备 33010602011771号