欢迎浏览我的博客 获取更多精彩文章
https://boyn.top
在Mongodb中,查询操作并不复杂,但是却十分常用.
下面我们会通过一个例子来说明查询函数的使用方法.
首先,我们要先在Mongo Shell里面插入对应的数据
db.inventory.insertMany([
{ item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
{ item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "A" },
{ item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
{ item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
{ item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" }
]);
如果要查询表中所有的数据,可以使用以下语句
db.inventory.find( {} )
等价于以下SQL
SELETE * FROM inventory
如果要查询指定的数据,我们要构造一个键值对列表{
来作为过滤器
db.inventory.find({status:"D"})
等价于以下语句
SELETE * FROM inventory where status="D"
查询结果如下
// 1
{
"_id": ObjectId("5d76f85cb400000011006ff8"),
"item": "paper",
"qty": 100,
"size": {
"h": 8.5,
"w": 11,
"uom": "in"
},
"status": "D"
}
// 2
{
"_id": ObjectId("5d76f85cb400000011006ff9"),
"item": "planner",
"qty": 75,
"size": {
"h": 22.85,
"w": 30,
"uom": "cm"
},
"status": "D"
}
可以通过构造以下键值对来进行特定条件的查询
{ <field1>: { <operator1>: <value1> }, ... }
比如说,我们要查询status为A或者D的数据,可以这样
db.inventory.find( { status: { $in: [ "A", "D" ] } } )
结果为
// 1
{
"_id": ObjectId("5d76f85cb400000011006ff6"),
"item": "journal",
"qty": 25,
"size": {
"h": 14,
"w": 21,
"uom": "cm"
},
"status": "A"
}
// 2
{
"_id": ObjectId("5d76f85cb400000011006ff7"),
"item": "notebook",
"qty": 50,
"size": {
"h": 8.5,
"w": 11,
"uom": "in"
},
"status": "A"
}
// 3
{
"_id": ObjectId("5d76f85cb400000011006ff8"),
"item": "paper",
"qty": 100,
"size": {
"h": 8.5,
"w": 11,
"uom": "in"
},
"status": "D"
}
// 4
{
"_id": ObjectId("5d76f85cb400000011006ff9"),
"item": "planner",
"qty": 75,
"size": {
"h": 22.85,
"w": 30,
"uom": "cm"
},
"status": "D"
}
// 5
{
"_id": ObjectId("5d76f85cb400000011006ffa"),
"item": "postcard",
"qty": 45,
"size": {
"h": 10,
"w": 15.25,
"uom": "cm"
},
"status": "A"
}
关于操作符,官网网站给出了支持的条件列表
在find()函数中,可以给定多个键值对的对象作为查询条件,这些键值对对象在逻辑上是用与连接在一起的.只有当文档满足所有给出的条件时,才会被查询到
比如说,我们想要查找一个status为A并且qty小于30的文档
db.inventory.find( { status: "A", qty: { $lt: 30 } } )
结果如下
// 1
{
"_id": ObjectId("5d76f85cb400000011006ff6"),
"item": "journal",
"qty": 25,
"size": {
"h": 14,
"w": 21,
"uom": "cm"
},
"status": "A"
}
在有的时候,我们想要的是几个条件任意满足其一即可,那么我们就可以用OR操作符来指定条件.
比如说,我们想要查找一个status为A或者qty小于30的文档
db.inventory.find( { $or: [ { status: "A" }, { qty: { $lt: 30 } } ] } )
需要注意的是,在这里,两个查询条件是作为$or列表的两个元素分开的,而不是像上一节一样在一个对象中.
如果我们误将条件写成了这样
db.inventory.find( { $or: [ { status: "A" , qty: { $lt: 30 } } ] } )
那么,$or列表只有一个元素,其实就变成了AND条件
执行正确语句时,结果如下
// 1
{
"_id": ObjectId("5d76f85cb400000011006ff6"),
"item": "journal",
"qty": 25,
"size": {
"h": 14,
"w": 21,
"uom": "cm"
},
"status": "A"
}
// 2
{
"_id": ObjectId("5d76f85cb400000011006ff7"),
"item": "notebook",
"qty": 50,
"size": {
"h": 8.5,
"w": 11,
"uom": "in"
},
"status": "A"
}
// 3
{
"_id": ObjectId("5d76f85cb400000011006ffa"),
"item": "postcard",
"qty": 45,
"size": {
"h": 10,
"w": 15.25,
"uom": "cm"
},
"status": "A"
}
通过上面,我们可以将or,与and条件结合起来,只需要记住or和and不同的调用顺序就可以随心所欲了.
我们来看下面这个例子
db.inventory.find( {
status: "A",
$or: [ { qty: { $lt: 30 } }, { item: /^p/ } ]
} )
他的条件为 status=A and (qty<30 or item为p开头)
这里对item的匹配为正则表达式,结果如下
// 1
{
"_id": ObjectId("5d76f85cb400000011006ff6"),
"item": "journal",
"qty": 25,
"size": {
"h": 14,
"w": 21,
"uom": "cm"
},
"status": "A"
}
// 2
{
"_id": ObjectId("5d76f85cb400000011006ffa"),
"item": "postcard",
"qty": 45,
"size": {
"h": 10,
"w": 15.25,
"uom": "cm"
},
"status": "A"
}
关于对查询的更多使用,可以参见官方文档.