对文档的查询
find查询
在指定的db下,使用
db.集合名.find(
查询操作符指定条件,
投影操作符指定返回
)
来确定以什么样的条件(相当于SQL中的WHERE)来对这个集合做查询,返回哪些查询结果(相当于SQL中的SELECT)。
投影操作符省略时,默认返回文档的所有键值对;查询操作符省略时,默认获取集合中的所有文档。
条件操作符
MongoDB的BSON中的key可以视为RDBMS中的列名,某文档下该key对应的value可以视为某元组中这一列的值。
含义 | 写法 | 英文释义 |
---|---|---|
key=value | {key:value} | - |
key<value | {key:{$lt,value}} | less than |
key<=value | {key:{$lte,value}} | less than equal |
key>value | {key:{$gt,value}} | greater than |
key>=value | {key:{$gte,value}} | greater than equal |
key!=value | {key:{$ne,value}} | not equal |
例
> db.lzhCllctn1.find()
{ "_id" : ObjectId("5b29cfbaf5b9d062d3a61e5c"), "a" : 1 }
{ "_id" : ObjectId("5b29cfc5f5b9d062d3a61e5d"), "a" : 2, "b" : 1 }
{ "_id" : ObjectId("5b29cfd5f5b9d062d3a61e5e"), "a" : 1, "b" : 1 }
> db.lzhCllctn1.find({'a':{$gt:1}})
{ "_id" : ObjectId("5b29cfc5f5b9d062d3a61e5d"), "a" : 2, "b" : 1 }
> db.lzhCllctn1.find({'a':{$gte:1}})
{ "_id" : ObjectId("5b29cfbaf5b9d062d3a61e5c"), "a" : 1 }
{ "_id" : ObjectId("5b29cfc5f5b9d062d3a61e5d"), "a" : 2, "b" : 1 }
{ "_id" : ObjectId("5b29cfd5f5b9d062d3a61e5e"), "a" : 1, "b" : 1 }
> db.lzhCllctn1.find({'a':{$ne:2}})
{ "_id" : ObjectId("5b29cfbaf5b9d062d3a61e5c"), "a" : 1 }
{ "_id" : ObjectId("5b29cfd5f5b9d062d3a61e5e"), "a" : 1, "b" : 1 }
>
逻辑表达式的组合条件
AND条件
在逻辑表达式用连续的AND条件组合时,每个逻辑表达式会剖去外层的{}
BSON壳,组合在一个BSON里。
{条件1,条件2,条件3,...}
例
> db.lzhCllctn1.find({a:{$ne:2},b:1})
{ "_id" : ObjectId("5b29cfd5f5b9d062d3a61e5e"), "a" : 1, "b" : 1 }
>
OR条件
OR条件的每个逻辑表达式会保留自己的{}
壳,并由以关键字$or
为键的数组囊括。
{$or:[{条件1},{条件2},{条件3},...]}
例
> db.lzhCllctn1.find({$or:[{a:2},{b:{$ne:1}}]})
{ "_id" : ObjectId("5b29cfbaf5b9d062d3a61e5c"), "a" : 1 }
{ "_id" : ObjectId("5b29cfc5f5b9d062d3a61e5d"), "a" : 2, "b" : 1 }
>
对文档的删除
remove删除
在指定的db下,使用
db.集合名.remove({条件})
可以按前面学的条件删除集合中指定的文档。
db.集合名.remove({})
可以删除该集合中的全部文档,即无条件删除。
例
> db.lzhCllctn1.find({})
{ "_id" : ObjectId("5b29cfbaf5b9d062d3a61e5c"), "a" : 1 }
{ "_id" : ObjectId("5b29cfc5f5b9d062d3a61e5d"), "a" : 2, "b" : 1 }
{ "_id" : ObjectId("5b29cfd5f5b9d062d3a61e5e"), "a" : 1, "b" : 1 }
> db.lzhCllctn1.remove({a:1,b:1})
WriteResult({ "nRemoved" : 1 })
> db.lzhCllctn1.find({})
{ "_id" : ObjectId("5b29cfbaf5b9d062d3a61e5c"), "a" : 1 }
{ "_id" : ObjectId("5b29cfc5f5b9d062d3a61e5d"), "a" : 2, "b" : 1 }
> db.lzhCllctn1.remove({})
WriteResult({ "nRemoved" : 2 })
> db.lzhCllctn1.find({})
>
类型操作符
类型-数字对照表
摘自runoob,废弃的6号就不记录了。
类型 | 查询所用数字 |
---|---|
Double | 1 |
String | 2 |
Object | 3 |
Array | 4 |
Binary data | 5 |
Object id | 7 |
Boolean | 8 |
Date | 9 |
Null | 10 |
Regular Expression | 11 |
JavaScript | 13 |
Symbol | 14 |
JavaScript (with scope) | 15 |
32-bit integer | 16 |
Timestamp | 17 |
64-bit integer | 18 |
Min key | -1(255) |
Max key | 127 |
类型操作符的使用
测试某key对应的value是某个类型,使用
{key:{$type:数字}}
其中数字为要测试的类型对应上表中的数字。
例
> db.lzhCllctn1.insert({a:1,b:'1'})
WriteResult({ "nInserted" : 1 })
> db.lzhCllctn1.insert({a:1,b:1})
WriteResult({ "nInserted" : 1 })
> db.lzhCllctn1.find({})
{ "_id" : ObjectId("5b29d817f5b9d062d3a61e5f"), "a" : 1, "b" : "1" }
{ "_id" : ObjectId("5b29d81ff5b9d062d3a61e60"), "a" : 1, "b" : 1 }
> db.lzhCllctn1.find({b:{$type:18}})
> db.lzhCllctn1.find({b:{$type:1}})
{ "_id" : ObjectId("5b29d81ff5b9d062d3a61e60"), "a" : 1, "b" : 1 }
> db.lzhCllctn1.find({b:{$type:2}})
{ "_id" : ObjectId("5b29d817f5b9d062d3a61e5f"), "a" : 1, "b" : "1" }
> db.lzhCllctn1.remove({b:{$type:2}})
WriteResult({ "nRemoved" : 1 })
> db.lzhCllctn1.find({})
{ "_id" : ObjectId("5b29d81ff5b9d062d3a61e60"), "a" : 1, "b" : 1 }
>
在查询类型18时没有返回结果,说明MongoDB中默认插入的数字类型是Double。
> db.lzhCllctn1.find({b:{$type:16}})
> db.lzhCllctn1.find({b:{$type:1}})
{ "_id" : ObjectId("5b29d81ff5b9d062d3a61e60"), "a" : 1, "b" : 1 }
>
看来16号对应的32位Integer也是不行的,Double就是Double。