MongoDB原生脚本的CURD--官方文档阅读笔记

安装&登录

0、Windows下使用从MongoDB官网下载MSI安装文件,感觉比zip的安装包使用便捷。Ubuntu Linux下使用sudo apt install mongodb-server安装、其配置文件路径为/etc/mongodb.conf、可以通过在其中配置数据库路径。
MongoDB原生脚本的CURD--官方文档阅读笔记_第1张图片
Mac下使用brew install mongodb,其配置信息可参考如下:
MongoDB原生脚本的CURD--官方文档阅读笔记_第2张图片
1、mongod --bind_all 默认只能本机访问MongoDB、使用此选项可以让别的机器通过网络访问
2、如果不能访问,检查端口是否开放,默认为27017。AWS的EC2需要在入站规则中加入该端口才会生效。
3、使用mongo进入数据库后、创建用户与密码。

Mongo Shell

insert

db.collection.insert(
   <document or array of documents>,
   {
     writeConcern: <document>, // 
     ordered: <boolean> // 按顺序插入
   }
)
db.inventory.insertOne(
   { item: "canvas", qty: 100, tags: ["cotton"], size: { h: 28, w: 35.5, uom: "cm" } }
)

save

Updates an existing document or inserts a new document, depending on its document parameter.

query

一般查询:

db.inventory.find( {} )
db.inventory.find( { status: "D" } )

使用查询操作符查询:
更多查询操作符:https://docs.mongodb.com/manual/reference/operator/query/

// 格式:{ : { :  }, ... }
db.inventory.find( { status: { $in: [ "A", "D" ] } } )

使用AND

// status==‘A’ && qty < 30
db.inventory.find( { status: "A", qty: { $lt: 30 } } )

使用OR

// status==‘A’ || qty < 30
db.inventory.find( { $or: [ { status: "A" }, { qty: { $lt: 30 } } ] } )

// status=='A' && (qty < 30 || item like 'p%')
db.inventory.find( {
     status: "A",
     $or: [ { qty: { $lt: 30 } }, { item: /^p/ } ]
} )

正则表达式
详细可参考:https://docs.mongodb.com/manual/reference/operator/query/regex/

/* 格式:
{ : { $regex: /pattern/, $options: '' } }
{ : { $regex: 'pattern', $options: '' } }
{ : { $regex: /pattern/ } }
-----
{ : /pattern/ }
*/
----------------------------------------------------------
// 查询title以h开头的文档,options里面有i说明大小写不敏感
db.bizQuestion.find( {
	title : {$regex : /^h/, $options:'i'}
} )

两种格式的使用场景存在差异,具体可参考上述链接:

{ name: { $in: [ /^acme/i, /^ack/ ] } } // 这里只能使用第二种格式

MongoDB原生脚本的CURD--官方文档阅读笔记_第3张图片
如果文档中的某个字段的值是文档

// 插入--注意size的结构
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( { size: { h: 14, w: 21, uom: "cm" } } )   // OK
db.inventory.find( { size: { w: 21, h: 14, uom: "cm" } } )   // X, 注意顺序,这里匹配不到任何东西

执行效果如下:
MongoDB原生脚本的CURD--官方文档阅读笔记_第4张图片
如果只以size中的某一个字段为查询域

db.inventory.find( { "size.uom": "in" } )
db.inventory.find( { "size.h": { $lt: 15 } } )
db.inventory.find( { "size.h": { $lt: 15 }, "size.uom": "in", status: "D" } )

其中的字段还可以为一个数组,数组中的数据可以是一个简单的类型,如整数、字符串等,也可以还是一个文档。对于这些情况,其查询方式存在或多或少的差异,可以在需要的时候参考官方文档。

如何返回自己想要的字段

前面查询得到的结果都是全部的字段,如果不需要返回所有的字段,可以通过设置projection来达到目的,projection的解释:

A document given to a query that specifies which fields MongoDB returns in the result set.

其中还包括字段为数组以及数组中的字段为文档的多种情况。

// 初始数据结构
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 } ] }
]);

// 返回结果显示item,status,不显示_id
db.inventory.find( { status: "A" }, { item: 1, status: 1, _id: 0 } )
// 如果字段的值也是一个文档
db.inventory.find(
   { status: "A" },
   { item: 1, status: 1, "size.uom": 1 }
)
// 字段为数组,数组的类型是文档
db.inventory.find( { status: "A" }, { item: 1, status: 1, "instock.qty": 1 } )

update

db.books.update(
  { _id: 1 },
  {
    $inc: { stock: 5 },
    $set: {
      item: "ABC123",
      "info.publisher": "2222",
      tags: [ "software" ],
      "ratings.1": { by: "xyz", rating: 3 }
    }
  }
)
-------------------------------------------------------------------
try {
  db.restaurant.updateMany(
    { violations: { $gt: 4 } },
    { $set: { "Review" : true } }
  );
} catch (e) {
  print(e);
}
-------------------------------------------------------------------
// The following operation updates a single document where name: "Central Perk Cafe" with the violations field:

try {
  db.restaurant.updateOne(
    { "name" : "Central Perk Cafe" },
    { $set: { "violations" : 3 } }
  );
} catch (e) {
  print(e);
}
-------------------------------------------------------------------
// The following operation attempts to update the document with name : "Pizza Rat's Pizzaria", while upsert: true :
// 对于这个upsert:true这个参数,update--insert。如果为true并且前面的query没有匹配到,则会进行插入,否则更新。
try {
  db.restaurant.updateOne(
    { "name" : "Pizza Rat's Pizzaria" },
    { $set: {"_id" : 4, "violations" : 7, "borough" : "Manhattan" } },
    { upsert: true }
  );
} catch (e) {
  print(e);
}

你可能感兴趣的:(数据库)