mongodb 重温之路 ( 二 )
插入文档
mongodb 查询使用 find()
方法。
db.collection.find(query, projection) * query 可选,使用查询操作符指定查询条件 * projection 可选,使用投影操作符指定返回的键 // 如果想以易读的方式读出,使用 `pretty()` db.col.find().pretty() // 除了find() 之外还有 findOne() 顾名思义是只找一个
AND
db.col.find({"title":"zjj" , "sex":"男"})
OR
db.col.find({$or[{key: val1}, {key1: val2}]})
OR 和 AND
db.col.find({"like": {$gt: 50}, $or:[{"by":"zjj"},{"title":"zjjasdada"}]})
条件操作符
一、查询于投影
1.1 比较运算符
$eq
// = // 查询 age = 20 db.person.find({ age: { $eq: 20 } }) // 相当于 db.person.find({age: 20})
$gt
// > // 查询 age > 20 db.person.find({age: {$gt: 20}})
$lt
// < // 查询 age < 20 db.person.find({age: {$lt: 20}})
$gte
// >= // 查询 age >= 20 db.person.find({age: {$gte: 20}})
$lte
// <= // 查询 age <= 20 db.person.find({age: {$lte: 20}})
$ne
// ≠ // 查询 age ≠ 20 db.person.find({age: {$ne: 20}})
$in
// ≠ // 匹配数组中的任一值 db.person.find({qyt: {$in :[5, 12]}})
$nin
// nin // 不匹配数组中的值 db.person.find({qty : {$nin: [2,322]}})
1.2 逻辑运算符
$or
// 或 条件查询 db.person.find({$or: [{age: {$lt: 20}},{address: "beijing"}]})
$and
// 且 条件查询 db.person.find({$and: [{age: {$lt: 20}},{address: "beijing"}]})
$not
// 查询与表达式不匹配的文档 db.person.find({age: {$not: {$gt: 20}}});
$nor
// 查询与任一表达式都不匹配的文档 db.col.find({$nor: [{age: 20}, {sex: "男"}]}})
1.3 元素运算符
$exists
// 查询存在指定字段的文档 // 查询存在phone字段的文档: db.col.find({phone: {$exists: true}})
$type
// 查询类型为指定类型的文档,3.2版本添加alias别名,各种类型的Number及Alias如下
// 假设有 { "_id": 1, address: "2030 Martian Way",zipCode: "90698345"}, { "_id": 2, address: "156 Lunar Place",zipCode: 43339374}, { "_id": 3, address: "2324 Pluto Place",zipCode: NumberLong(3921412)}, { "_id": 4, address: "55 Saturn Ring", zipCode: NumberInt(88602117)} // 查询该集合中zipCode字段的数据类型为String类型的文档: db.col.find({zipCode: {$type: "string"}}); db.addressBook.find( { "zipCode" : { $type : 2 } } );
1.4 元素运算符
$mod
// 取余条件查询 // 查询age字段的值除以2余0的文档: db.person.find( { age: {$mod : [2, 0] } } )
$regex
// 正则表达式查询 db.person.find({sku: { $regex: /^ABC/i }})
$text
// 文本索引查询 { $text: { $search: <string>, $language: <string>, $caseSensitive: <boolean>, $diacriticSensitive: <boolean> } } // 具体请查看官方文档
$where
// 可以支持字符穿或者是函数 db.myCollection.find( { $where: "this.credits == this.debits" } ); db.myCollection.find( { $where: function() { return obj.credits == obj.debits; } } );
1.5 数组操作符
$all
// 匹配文档的数组字段中包含所有指定元素的文档 查询articles集合中tags字段(是个数组)包含“ssl”和“security”的文档(包含,但并不是全部等于) db.articles.find({tagS: { $all:[ ["aal", "dsada"] ] } })
$elemMatch()
匹配内嵌文档或数组中的部分field // 假设有 { _id: 1, results: [ 82, 85, 88 ] } { _id: 2, results: [ 75, 88, 89 ] } db.col.find({results: { $elemMatch: { $gte: 80, $lt: 85} } }); // 查询results数组中含有区间[80,85)元素的文档(结果为第一条);
$size
// 匹配数组长度为指定大小的文档 查询已经集齐了5张福卡的文档: db.person.find({card:{$size:5}})
1.6投影操作符
$(projection)
//查询数组中首个匹配条件的元素,相当于findOne()方法 { "_id" : 1, "semester" : 1, "grades" : [ 70, 87, 90 ] } { "_id" : 2, "semester" : 1, "grades" : [ 90, 88, 92 ] } { "_id" : 3, "semester" : 1, "grades" : [ 85, 100, 90 ] } { "_id" : 4, "semester" : 2, "grades" : [ 79, 85, 80 ] } { "_id" : 5, "semester" : 2, "grades" : [ 88, 88, 92 ] } { "_id" : 6, "semester" : 2, "grades" : [ 95, 90, 96 ] } db.student.find({semester : 1 , grades: {$gte: 85}}, {"grades.$": 1}); 查询semester=1,并且grades中符合大于等于85的元素的第一个元素: // 查询结果是 { "_id" : 1, "grades" : [ 87 ] } { "_id" : 2, "grades" : [ 90 ] } { "_id" : 3, "grades" : [ 85 ] }
$(projection)
{ _id: 1, zipcode: "63109", students: [ { name: "john", school: 102, age: 10 }, { name: "jess", school: 102, age: 11 }, { name: "jeff", school: 108, age: 15 } ] } { _id: 2, zipcode: "63110", students: [ { name: "ajax", school: 100, age: 7 }, { name: "achilles", school: 100, age: 8 }, ] } { _id: 3, zipcode: "63109", students: [ { name: "ajax", school: 100, age: 7 }, { name: "achilles", school: 100, age: 8 }, ] } //查询zipcode为63109并且students数组中school=102的文档: db.school.find({ zipcode: "63109" }, {student: { $elemMatch: { school: 102 } } } ) // result { "_id" : 1, "students" : [ { "name" : "john", "school" : 102, "age" : 10 } ] } { "_id" : 3 }
$slice
// 在查询中将数组进行切片(类似于分页) (1)查询结果中,对于comments数组的元素只显示前5个: db.posts.find( {}, { comments: { $slice: 5 } } ) (2)查询结果中,对于comments数组的元素只显示后5个: db.posts.find( {}, { comments: { $slice: -5 } } ) (3)查询结果中,对于comments数组的元素跳过(skip)前20个,并只显示(limit)10个元素(即21-30): db.posts.find( {}, { comments: { $slice: [ 20, 10 ] } } ) (4)同理,跳过后20个,并显示10个: db.posts.find( {}, { comments: { $slice: [ -20, 10 ] } } )
skip 和 Limit
limit
// 获取20条 db.things.find().limit(20);
limit
// 跳过20.再选20条 db.things.find().skip(20).limit(20)
排序
db.things.find().sort({"likes":-1}) -1表示倒序排列
相关推荐
lbyd0 2020-11-17
BigYellow 2020-11-16
sushuanglei 2020-11-12
我心似明月 2020-11-09
zhushenghan 2020-11-09
sunnnyduan 2020-10-16
不要皱眉 2020-10-14
xiaohai 2020-09-29
songxiugongwang 2020-09-22
萌亖 2020-09-17
LuckyLXG 2020-09-08
sdmzhu 2020-09-01
mkhhxxttxs 2020-09-16
xiaohai 2020-09-16
newcome 2020-09-09
jaylong 2020-08-19
大秦铁骑 2020-08-19
thatway 2020-08-19