今天继续CRUD部分的复习。javascript
昨天还遗留3个内容没复习,今天补上java
生成几条测试数据shell
db.inventory.insertMany([ { _id: 1, item: null }, { _id: 2 } ])
若是下面这样写,除返回值是 null 的文档以外,还返回不包含 item 字段的文档。数据库
> db.inventory.find( { item: null } ) { "_id" : 1, "item" : null } { "_id" : 2 }
那么,若是我只想返回值是 null 的数据呢?数组
> db.inventory.find( { item : { $type: 10 } } ) { "_id" : 1, "item" : null }
$type 为 10 表示的是MongoDB内置类型为 null,更多的类型以下post
类型 | 数字 | 别名 |
---|---|---|
Double | 1 | “double” |
String | 2 | “string” |
Object | 3 | “object” |
Array | 4 | “array” |
Binary data | 5 | “binData” |
ObjectId | 7 | “objectId” |
Boolean | 8 | “bool” |
Date | 9 | “date” |
Null | 10 | “null” |
Regular Expression | 11 | “regex” |
JavaScript | 13 | “javascript” |
JavaScript (with scope) | 15 | “javascriptWithScope” |
32-bit integer | 16 | “int” |
Timestamp | 17 | “timestamp” |
64-bit integer | 18 | “long” |
Decimal128 | 19 | “decimal” |
Min key | -1 | “minKey” |
Max key | 127 | “maxKey” |
> db.inventory.find( { item : { $exists: false } } ) { "_id" : 2 }
如今数据是这样的测试
> db.inventory.find() { "_id" : 1, "item" : null } { "_id" : 2 } { "_id" : ObjectId("5e089a29667bbe281bb9a88b"), "item" : "journal", "status" : "A", "size" : { "h" : 14, "w" : 21, "uom" : "cm" }, "instock" : [ { "warehouse" : "A", "qty" : 5 } ] } { "_id" : ObjectId("5e089a29667bbe281bb9a88c"), "item" : "notebook", "status" : "A", "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "instock" : [ { "warehouse" : "C", "qty" : 5 } ] } { "_id" : ObjectId("5e089a29667bbe281bb9a88d"), "item" : "paper", "status" : "D", "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "instock" : [ { "warehouse" : "A", "qty" : 60 } ] } { "_id" : ObjectId("5e089a29667bbe281bb9a88e"), "item" : "planner", "status" : "D", "size" : { "h" : 22.85, "w" : 30, "uom" : "cm" }, "instock" : [ { "warehouse" : "A", "qty" : 40 } ] } { "_id" : ObjectId("5e089a29667bbe281bb9a88f"), "item" : "postcard", "status" : "A", "size" : { "h" : 10, "w" : 15.25, "uom" : "cm" }, "instock" : [ { "warehouse" : "B", "qty" : 15 }, { "warehouse" : "C", "qty" : 35 } ] } >
若是我要item与status其余不想要,怎么办。传入第二个对象。code
> db.inventory.find({}, {item: 1, status: 1, _id: 0}) { "item" : null } { } { "item" : "journal", "status" : "A" } { "item" : "notebook", "status" : "A" } { "item" : "paper", "status" : "D" } { "item" : "planner", "status" : "D" } { "item" : "postcard", "status" : "A" }
_id 字段比较特殊,必定要显示的指定,不然默认一直显示,而其余这段,若是不写,就不显示。
反过来,若是我只排除item与status不显示,而其余都显示呢?对象
> db.inventory.find( { }, { item: 0, status: 0 } ) { "_id" : 1 } { "_id" : 2 } { "_id" : ObjectId("5e089a29667bbe281bb9a88b"), "size" : { "h" : 14, "w" : 21, "uom" : "cm" }, "instock" : [ { "warehouse" : "A", "qty" : 5 } ] } { "_id" : ObjectId("5e089a29667bbe281bb9a88c"), "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "instock" : [ { "warehouse" : "C", "qty" : 5 } ] } { "_id" : ObjectId("5e089a29667bbe281bb9a88d"), "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "instock" : [ { "warehouse" : "A", "qty" : 60 } ] } { "_id" : ObjectId("5e089a29667bbe281bb9a88e"), "size" : { "h" : 22.85, "w" : 30, "uom" : "cm" }, "instock" : [ { "warehouse" : "A", "qty" : 40 } ] } { "_id" : ObjectId("5e089a29667bbe281bb9a88f"), "size" : { "h" : 10, "w" : 15.25, "uom" : "cm" }, "instock" : [ { "warehouse" : "B", "qty" : 15 }, { "warehouse" : "C", "qty" : 35 } ] }
可是,若是使用排除模式,就不能单独控制 _id 的显示了,不然报错,也就是不能混着用,要么排除,要么显示ip
> db.inventory.find( { }, { item: 0, status: 0, _id: 1 } ) Error: error: { "ok" : 0, "errmsg" : "Projection cannot have a mix of inclusion and exclusion.", "code" : 2, "codeName" : "BadValue" }
若是是返回内嵌文档,好比只返回size.uom
> db.inventory.find({},{"size.uom": 1, _id: 0}) { } { } { "size" : { "uom" : "cm" } } { "size" : { "uom" : "in" } } { "size" : { "uom" : "in" } } { "size" : { "uom" : "cm" } } { "size" : { "uom" : "cm" } }
若是控制返回数组内容,好比instock数组中的qty
> db.inventory.find({},{"instock.qty": 1,_id: 0}) { } { } { "instock" : [ { "qty" : 5 } ] } { "instock" : [ { "qty" : 5 } ] } { "instock" : [ { "qty" : 60 } ] } { "instock" : [ { "qty" : 40 } ] } { "instock" : [ { "qty" : 15 }, { "qty" : 35 } ] }
那么,若是只想返回最后一组呢,好比上面qty:35那组有2个,我只要最后一个
> db.inventory.find({},{instock: { $slice: -1 },"instock.qty": 1,_id: 0}) { } { } { "instock" : [ { "qty" : 5 } ] } { "instock" : [ { "qty" : 5 } ] } { "instock" : [ { "qty" : 60 } ] } { "instock" : [ { "qty" : 40 } ] } { "instock" : [ { "qty" : 35 } ] }
这块的内容,咱们前面已经用过几回了,insert插入一个文档,insertMany插入多个文档。每一个新插入的文档都会有一个_id作为主键,类型是ObjectId(),由系统自动生成。
db.inventory.insertOne({ item: "journal", status: "A", size: { h: 14, w: 21, uom: "cm" }, instock: [ { warehouse: "A", qty: 5 } ] })
> db.inventory.insertMany( [ { item: "journal", status: "A", size: { h: 14, w: 21, uom: "cm" }, instock: [ { warehouse: "A", qty: 5 } ] }, { item: "notebook", status: "A", size: { h: 8.5, w: 11, uom: "in" }, instock: [ { warehouse: "C", qty: 5 } ] }, { item: "paper", status: "D", size: { h: 8.5, w: 11, uom: "in" }, instock: [ { warehouse: "A", qty: 60 } ] }, { item: "planner", status: "D", size: { h: 22.85, w: 30, uom: "cm" }, instock: [ { warehouse: "A", qty: 40 } ] }, { item: "postcard", status: "A", size: { h: 10, w: 15.25, uom: "cm" }, instock: [ { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 } ] } ]);
若是要更新数据,也要传入2个对象,第一个是条件,第二是要更新字段及值。
> db.inventory.updateOne( { item: "paper" }, { $set: { "size.uom": "cm", status: "P" }, $currentDate: { lastModified: true } } ) { "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 } > db.inventory.findOne( { item: "paper" } ) { "_id" : ObjectId("5e089a29667bbe281bb9a88d"), "item" : "paper", "status" : "P", "size" : { "h" : 8.5, "w" : 11, "uom" : "cm" }, "instock" : [ { "warehouse" : "A", "qty" : 60 } ], "lastModified" : ISODate("2019-12-29T12:58:35.907Z") }
$currentDate: { lastModified: true },是指定若是存在lastModified字段就是用currentDate,也就是当前时间赋值,若是不存在,刚建立一个。
> db.inventory.updateOne( { item: "planner" }, { $set: { "size.uom": "cm", status: "P" } } ) { "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 } > db.inventory.findOne( { item: "planner" } ) { "_id" : ObjectId("5e089a29667bbe281bb9a88e"), "item" : "planner", "status" : "P", "size" : { "h" : 22.85, "w" : 30, "uom" : "cm" }, "instock" : [ { "warehouse" : "A", "qty" : 40 } ] }
> db.inventory.updateMany( { "instock.qty": { $lt: 50 } }, { $set: { "size.uom": "in", status: "P" }, $currentDate: { lastModified: true } } ) { "acknowledged" : true, "matchedCount" : 9, "modifiedCount" : 9 } > db.inventory.find({ "instock.qty": { $lt: 50 } }) { "_id" : ObjectId("5e089a29667bbe281bb9a88b"), "item" : "journal", "status" : "P", "size" : { "h" : 14, "w" : 21, "uom" : "in" }, "instock" : [ { "warehouse" : "A", "qty" : 5 } ], "lastModified" : ISODate("2019-12-29T13:09:08.872Z") } { "_id" : ObjectId("5e089a29667bbe281bb9a88c"), "item" : "notebook", "status" : "P", "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "instock" : [ { "warehouse" : "C", "qty" : 5 } ], "lastModified" : ISODate("2019-12-29T13:09:08.872Z") } { "_id" : ObjectId("5e089a29667bbe281bb9a88e"), "item" : "planner", "status" : "P", "size" : { "h" : 22.85, "w" : 30, "uom" : "in" }, "instock" : [ { "warehouse" : "A", "qty" : 40 } ], "lastModified" : ISODate("2019-12-29T13:09:08.872Z") } { "_id" : ObjectId("5e089a29667bbe281bb9a88f"), "item" : "postcard", "status" : "P", "size" : { "h" : 10, "w" : 15.25, "uom" : "in" }, "instock" : [ { "warehouse" : "B", "qty" : 15 }, { "warehouse" : "C", "qty" : 35 } ], "lastModified" : ISODate("2019-12-29T13:09:08.872Z") } { "_id" : ObjectId("5e08a1a1667bbe281bb9a890"), "item" : "journal", "status" : "P", "size" : { "h" : 14, "w" : 21, "uom" : "in" }, "instock" : [ { "warehouse" : "A", "qty" : 5 } ], "lastModified" : ISODate("2019-12-29T13:09:08.872Z") } { "_id" : ObjectId("5e08a1a1667bbe281bb9a891"), "item" : "notebook", "status" : "P", "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "instock" : [ { "warehouse" : "C", "qty" : 5 } ], "lastModified" : ISODate("2019-12-29T13:09:08.872Z") } { "_id" : ObjectId("5e08a1a1667bbe281bb9a893"), "item" : "planner", "status" : "P", "size" : { "h" : 22.85, "w" : 30, "uom" : "in" }, "instock" : [ { "warehouse" : "A", "qty" : 40 } ], "lastModified" : ISODate("2019-12-29T13:09:08.872Z") } { "_id" : ObjectId("5e08a1a1667bbe281bb9a894"), "item" : "postcard", "status" : "P", "size" : { "h" : 10, "w" : 15.25, "uom" : "in" }, "instock" : [ { "warehouse" : "B", "qty" : 15 }, { "warehouse" : "C", "qty" : 35 } ], "lastModified" : ISODate("2019-12-29T13:09:08.872Z") } { "_id" : ObjectId("5e08a1f1667bbe281bb9a895"), "item" : "journal", "status" : "P", "size" : { "h" : 14, "w" : 21, "uom" : "in" }, "instock" : [ { "warehouse" : "A", "qty" : 5 } ], "lastModified" : ISODate("2019-12-29T13:09:08.872Z") } >
注意,_id字段没法替换
> db.inventory.find({ item: "paper"}) { "_id" : ObjectId("5e089a29667bbe281bb9a88d"), "item" : "paper", "status" : "P", "size" : { "h" : 8.5, "w" : 11, "uom" : "cm" }, "instock" : [ { "warehouse" : "A", "qty" : 60 } ], "lastModified" : ISODate("2019-12-29T12:58:35.907Z") } { "_id" : ObjectId("5e08a1a1667bbe281bb9a892"), "item" : "paper", "status" : "D", "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "instock" : [ { "warehouse" : "A", "qty" : 60 } ] } > db.inventory.replaceOne( { item: "paper" }, { item: "paper", instock: [ { warehouse: "A", qty: 60 }, { warehouse: "B", qty: 40 } ] } ) > db.inventory.find({ item: "paper"}) { "_id" : ObjectId("5e089a29667bbe281bb9a88d"), "item" : "paper", "instock" : [ { "warehouse" : "A", "qty" : 60 }, { "warehouse" : "B", "qty" : 40 } ] } { "_id" : ObjectId("5e08a1a1667bbe281bb9a892"), "item" : "paper", "status" : "D", "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "instock" : [ { "warehouse" : "A", "qty" : 60 } ] } >
> db.inventory.deleteMany( { status: "P" } ) { "acknowledged" : true, "deletedCount" : 9 } > db.inventory.find( {} ) { "_id" : 1, "item" : null } { "_id" : 2 } { "_id" : ObjectId("5e089a29667bbe281bb9a88d"), "item" : "paper", "instock" : [ { "warehouse" : "A", "qty" : 60 }, { "warehouse" : "B", "qty" : 40 } ] } >
注意,注意,若是你不写条件,下面这个操做将删除全部文档
db.inventory.deleteMany({})
> db.inventory.deleteOne( { status: "D" } ) { "acknowledged" : true, "deletedCount" : 1 } > db.inventory.find( { status: "D" } ) >
只在mongoshell下可用
> db.inventory.drop() true
只在mongoshell下可用,删库跑路,删除当前数据库
> show dbs admin 0.000GB config 0.000GB foo 0.000GB local 0.000GB mock 0.047GB > use foo switched to db foo > db.dropDatabase() { "dropped" : "foo", "ok" : 1 } > show dbs admin 0.000GB config 0.000GB local 0.000GB mock 0.047GB >
今天完成CRUD全部基础操做的复习,固然还有不少高级的内容,先不纠结,先完成课程。明天继续复习聚合查询部分。