Hi~朋友,关注置顶防止错过消息
insertOne的语法格式如下:
db.collection.insertOne(
<document>,
{
writeConcern: <document>
}
)
writeConcern表明写操作成功的关注级别。
db.inventory.insertOne(
{ item: "canvas", qty: 100, tags: ["cotton"], size: { h: 28, w: 35.5, uom: "cm"} }
)
db.inventory.insertMany([
{ item: "journal", qty: 25, tags: ["blank", "red"], size: { h: 14, w: 21, uom: "cm"} },
{ item: "mat", qty: 85, tags: ["gray"], size: { h: 27.9, w: 35.5, uom: "cm"} },
{ item: "mousepad", qty: 25, tags: ["gel", "blue"], size: { h: 19, w: 22.85, uom: "cm"} }
])
Insert行为
MongoDB数据过滤查询
通过在find方法中传入Query Filter Documents,Query Filter Documents可以完成对特定记录的读取、更新和删除操作,格式如下:
{
<field1>: <value1>,
<field2>: { <operator>: <value>},
...
}
operator主要有以下几种:
上述操作符可以去官网查询具体的用法,有些本人也没有用到过,这里不再过多讲述,细节大家可以去官网查看。
使用相等条件进行查询
# 查询status为D的所有记录
db.inventory.find( { status: "D"} )
使用Query Opearators进行查询
# 查询status值为A或者D的记录
db.inventory.find( { status: { $in: [ "A", "D"] } } )
虽然上述功能可以用or实现,但是对于同一个field请使用in
使用AND进行查询
# 查询status为A并且qty<30的记录
db.inventory.find( { status: "A", qty: { $lt: 30} } )
上述我们并没有使用$and,MongoDB对于上述写法默认会使用and对其进行连接。
使用OR进行查询
# 查询status为A或者qty<30的记录
嵌套文档查询
嵌套文档属性的查询使用.来表示嵌套的field。
#查找size字段的嵌套字段uom值为in的记录
db.inventory.find( { "size.uom": "in"} )
数组查询
# 查找tags字段为["red", "blank"]的所有记录,包括元素的顺序
db.inventory.find( { tags: ["red", "blank"] } )
# 查找tags字段包含了red和blank的所有记录,忽略元素顺序
db.inventory.find( { tags: { $all: ["red", "blank"] } } )
# 查找tags字段包含read的的所有记录
db.inventory.find( { tags: "red"} )
# 查找dic_cm字段至少包含一个大于25的元素的所有记录
db.inventory.find( { dim_cm: { $gt: 25} } )
# 查找dic_cm字段满足即有大于15又有小于20的元素的所有记录
# 查找dic_cm字段满足至少有一个元素既大于22又小于30的所有记录
# 查找dic_cm字段中的第2个元素大于25的所有记录
db.inventory.find( { "dim_cm.1": { $gt: 25} } )
# 查找tags包含3个元素的所有记录
db.inventory.find( { "tags": { $size: 3} } )
嵌套数组文档查询
# 查找数组文档中包含{ warehouse: "A", qty: 5 }该元素文档的所有记录,字段顺序也要保持一致
db.inventory.find( { "instock": { warehouse: "A", qty: 5} } )
# 查找instock的数组对象中至少包含一个文档的qty<=20的所有记录
db.inventory.find( { 'instock.qty': { $lte: 20} } )
# 查找instock的数组对象中第一个文档的qty<=20的所有记录
db.inventory.find( { 'instock.0.qty': { $lte: 20} } )
# 查找instock的数组对象中至少有一个文档同时包含qty值为5,warehouse为A的所有记录
db.inventory.find( { "instock": { $elemMatch: { qty: 5, warehouse: "A"} } } )
# 查找instock的数组对象中包含qty>10且qty<=20元素的所有记录
# 查找查找instock的数组对象中有qty>10和qty<=20的元素(可以不在一个文档中)的所有记录
限制返回的字段
# 返回_id, item, status字段
db.inventory.find( { status: "A"}, { item: 1, status: 1} )
# 返回item, status字段
db.inventory.find( { status: "A"}, { item: 1, status: 1, _id: 0} )
# 返回除了status和instock以外的所有字段
db.inventory.find( { status: "A"}, { status: 0, instock: 0} )
# 返回_id, status, instock数组(只包含qty元素)
db.inventory.find( { status: "A"}, { item: 1, status: 1, "instock.qty": 1} )
# 返回_id, status, instock数组中最后一个元素
db.inventory.find( { status: "A"}, { item: 1, status: 1, instock: { $slice: -1} } )
也可以利用聚合函数返回自定义字段如下:
db.inventory.find(
{ },
{
_id: 0,
item: 1,
status: {
$switch: {
branches: [
{
then: "Available"
},
{
then: "Discontinued"
},
],
default: "No status found"
}
},
area: {
$concat: [
" ",
"$size.uom"
]
},
reportNumber: { $literal: 1}
}
)
查询null或者不存在的字段
#查找item字段为null或者item字段不存在的所有记录
db.inventory.find( { item: null} )
#查找item字段存在且不为null的所有记录
db.inventory.find( { item: { $ne : null} } )
#查找item字段类型为Null的所有记录
db.inventory.find( { item : { $type: 10} } )
#查找item字段不存在的所有记录
db.inventory.find( { item : { $exists: false} } )
MongoDB更新数据主要有以下三种方式:
为了更新Document,MongoDB提供了一批operators,如下:
数组的operators如下:
# 将item为paper的第一个文档中size.uom字段更新成cm,status字段更新为P,lastModified更新为当前日期
db.inventory.updateOne(
{ item: "paper"},
{
$set: { "size.uom": "cm", status: "P"},
$currentDate: { lastModified: true}
}
)
# 将qty<50的所有档中size.uom字段更新成in,status字段更新为P,lastModified更新为当前日期
db.inventory.updateMany(
{ "qty": { $lt: 50} },
{
$set: { "size.uom": "in", status: "P"},
$currentDate: { lastModified: true}
}
)
# 将item为paper的第一个文档替换为第2个参数中的文档
db.inventory.replaceOne(
{ item: "paper"},
{ item: "paper", instock: [ { warehouse: "A", qty: 60}, { warehouse: "B", qty: 40} ] }
)
replace的新文档中可以包含id,但是id必须要和原来的_id相等,新文档中不可以包含update operator表达式。
通过聚合操作进行数据更新
对于更新操作,聚合操作主要有以下操作符:
# 修改_id为3的记录,将test3字段的值设置为98,modified改为当前时间
# 将所有的记录先通过replaceRoot替换整个文档(replaceRoot中又使用了mergeObjects对文档进行合并操作),然后再设置每个文档modified为当前时间
db.students2.updateMany( {},
[
{ $replaceRoot: { newRoot:
} },
]
)
# 更新使用let来定义变量,可以在filter和update阶段使用$$进行引用
db.cakeFlavors.updateOne(
{
},
[
{
}
],
{
let: { targetFlavor: "cherry", newFlavor: "orange"}
}
)
别的更新方法
MongoDB使用以下方法进行删除:
其他删除方法
关于bulkWrite,后续文章单独写。