当前位置:   article > 正文

MongoDB 4.X CRUD 基本操作说明_db.collection.insert可选参数

db.collection.insert可选参数

简介: 本文总结了MongoDB 4.X在mongo shell客户端涉及的对文档一些基本的增删改查操作,即CRUD操作。

11.jpg


镜像下载、域名解析、时间同步请点击 阿里巴巴开源镜像站

一、创建(Create Operations)

创建(Create Operations)也叫插入操作,当集合不存在时,插入操作同时也会创建集合。MongoDB提供以下几种插入文档方法:

  • db.collection.insert():在指定集合中插入单个或多个文档。
  • db.collection.insertOne():在指定集合中插入单个文档(版本3.2新增)。
  • db.collection.insertMany():在指定集合中插入多个文档(版本3.2新增)。

1. db.collection.insert()

在平时的使用当中,db.collection.insert()是我用得最多的文档插入方式,具体的语法格式如下:

  1. db.collection.insert(
  2. <document or array of documents>,
  3. {
  4. writeConcern: <document>,
  5. ordered: <boolean>
  6. }
  7. )

参数说明:

  • document:指定一个或多个文档;
  • writeConcern:文档写入确认级别(可选),关于读写策略确认级别,以后再进行讨论;
  • ordered:指定文档是否按顺序插入(可选),默认为true;

    • 当指定为true时,插入多个文档时将文档排序保存在一个数组中进行插入,如果其中有一个文档插入失败,则会导致数组中余下的文档不进行插入操作;
    • 当指定为false时,插入多个文档时将文档不进行排序保存在一个数组中进行插入,如果其中有一个文档插入失败,则不影响数组中余下的文档进行插入操作。

如果插入的文档当中没有指定_id字段,则MongoDB会自动为文档生成具有唯一ObjectId值的字段_id
使用示例:

  1. // 没有指定_id字段的插入单个文档
  2. db.products.insert( { item: "card", qty: 15 } );
  3. // 指定_id字段的插入单个文档
  4. db.products.insert( { _id: 10, item: "box", qty: 20 } );
  5. // 插入多个文档,不进行排序,多个文档包含在数组[]中
  6. db.products.insert(
  7. [
  8. { _id: 11, item: "pencil", qty: 50, type: "no.2" },
  9. { item: "pen", qty: 20 },
  10. { item: "eraser", qty: 25 }
  11. ]
  12. );
  13. // 插入多个文档,并进行排序
  14. db.products.insert(
  15. [
  16. { _id: 20, item: "lamp", qty: 50, type: "desk" },
  17. { _id: 21, item: "lamp", qty: 20, type: "floor" },
  18. { _id: 22, item: "bulk", qty: 100 }
  19. ],
  20. { ordered: false }
  21. );

2. db.collection.insertOne()

语法格式如下:

  1. db.collection.insertOne(
  2. <document>,
  3. {
  4. writeConcern: <document>
  5. }
  6. )

参数说明:参考db.collection.insert()的参数说明。
使用示例:

  1. // 单行插入文档,关于_id字段指定与否也与db.collection.insert()一致
  2. db.products.insertOne( { item: "card", qty: 15 } );

3. db.collection.insertMany()

语法格式如下:

  1. db.collection.insertMany(
  2. [ <document 1> , <document 2>, ... ],
  3. {
  4. writeConcern: <document>,
  5. ordered: <boolean>
  6. }
  7. )

参数说明:参考db.collection.insert()的参数说明。
使用示例:参考db.collection.insert()的参数说明。

4. 关于返回确认信息

db.collection.insert()在插入文档成功之后返回的信息相对较为简洁:

  1. db.products.insert( { item: "card", qty: 15 } );
  2. WriteResult({ "nInserted" : 1, "writeConcernError" : [ ] })

db.collection.insertOne()db.collection.insertMany()返回的信息较为详细:

  1. db.products.insertOne( { item: "card", qty: 15 } );
  2. {
  3. "acknowledged": true,
  4. "insertedId": ObjectId("5eccbd214139000074003be8")
  5. }
  6. db.products.insertMany( [
  7. { _id: 10, item: "large box", qty: 20 },
  8. { _id: 11, item: "small box", qty: 55 },
  9. { _id: 12, item: "medium box", qty: 30 }
  10. ] );
  11. {
  12. "acknowledged": true,
  13. "insertedIds": [
  14. 10,
  15. 11,
  16. 12
  17. ]
  18. }

二、查询(Read Operations)

查询(Read Operations)读操作,是对集合中已存在的文档进行查询,即对应关系型数据库当中的select操作,比如MySQL,MongoDB提供以下几种主要查询文档方法:

  • db.collection.find():查询指定集合中满足条件的一个或多个文档和视图;
  • db.collection.findOne():查询指定集合中满足条件的第一个文档,并以格式化方式展现,通过pretty()方法。

来自官方文档的测试数据:

  1. db.inventory.insertMany([
  2. { item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
  3. { item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "A" },
  4. { item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
  5. { item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
  6. { item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" }
  7. ]);

1. db.collection.find()

db.collection.find()可以说是使用频率最高的方法了,可以用来查询数据库集合当中的文档。
语法格式如下:

db.collection.find(<query>, <projection>)
  • query:查询表达式;
  • projection:指定查询结果集中需要显示的字段。

    • Col_name:1|true 代表显示该字段;
    • Col_name:0 | false 代表不显示该字段。

_id字段是默认显示的,如果不想显示,则显式指定{"_id" : 0}
查询所有文档:

db.inventory.find()

db.inventory.find({})

2. db.collection.findOne()

db.collection.findOne()方法显示符合条件查询的第一条文档,接受的参数与db.collection.find()方法一致。

3. 条件查询操作符

通常对文档的查询,是需要带条件的,而很少使用到不带条件的全文档检索,以下总结了几种常使用的查询操作符:

比较操作符

比较操作符涉及的操作如下表所示:

名称说明
$eq与指定值相等
$gt大于指定的值
$gte大于或等于指定的值
$in指定的值在数组中
$lt小于指定的值
$lte小于或等于指定的值
$ne所有不等于指定的值
$nin指定的值不在数组中

使用示例:

  1. // $eq:等值查询 SQL: SELECT * FROM inventory WHERE status = "D";
  2. db.inventory.find( { status: "D" } )
  3. // $ne 同$eq
  4. // $gt:范围查询(以大于为例) SQL: SELECT * FROM inventory WHERE qty > 30;
  5. db.inventory.find( { qty: { $gt: 30 } } )
  6. // $gte、$lt、$lte 同$gt
  7. // $in:或查询,可使用or代替 SQL: SELECT * FROM inventory WHERE status in ("A", "D")
  8. db.inventory.find( { status: { $in: [ "A", "D" ] } } )
  9. // $nin 同$in

逻辑操作符

逻辑操作符涉及的操作如下表所示:

名称说明
$and指定查询同时满足多个条件查询子句
$not指定查询不满足条件查询子句
$nor指定查询无法满足多个条件查询子句
$or指定查询满足其中某个条件查询子句

使用示例:

  1. // $and: 逻辑与查询 SQL: SELECT * FROM inventory WHERE status = "A" AND qty < 30;
  2. db.inventory.find( { $and: [ { status: { $eq: "A" }, qty: { $lt: 30 } } ] } )
  3. // $not: 不符合查询 SQL: SELECT * FROM inventory WHERE status <> "A";
  4. db.inventory.find( { status: { $not: { $eq: "A" } } } )
  5. /*
  6. $nor: 无法同时满足多个条件查询,字段不存在时也符合 SQL: SELECT * FROM inventory WHERE status <> "A" AND qty > 30;
  7. 符合以下条件之一都会出现在结果集中:
  8. 1.文档包含status和qty字段并且符合条件;
  9. 2.文档包含status字段并且符合条件,不包含qty字段;
  10. 3.文档不包含status字段,包含qty字段并且符合条件;
  11. 4.文档不包含status字段和qty字段。
  12. */
  13. db.inventory.find( { $nor: [ { status: { $eq: "A" } }, { qty: { $lt: 30 } } ] } )
  14. // $or: 逻辑或查询 SQL: SELECT * FROM inventory WHERE status = "A" OR qty < 30;
  15. db.inventory.find( { $or: [ { status: "A" }, { qty: { $lt: 30 } } ] } )

元素操作符

元素操作符主要涉及的操作如下表所示:

名称说明
$exists指定查询文档是否有对应的字段
$type指定查询文档的某个字段是否是对应类型

使用示例:

  1. // $exists: 是否存在指定字段查询
  2. db.inventory.find( { price: { $exists: true } } )
  3. // $type: 字段是否是指定类型查询
  4. db.inventory.find( { "qty": { $type: "double" } } )

评估操作符

评估操作符主要涉及的操作如下表所示,更多操作符可以参考官方文档:https://docs.mongodb.com/manual/reference/operator/query-evaluation/

名称说明
$expr为同一个文档中的字段指定表达式并且符合条件的查询,比如比较同一文档当中两个字段的值
$mod为字段值取模并且符合条件的查询

为了更好的使用这两个主要的操作符,额外创建个文档:

  1. db.monthlyBudget.insertMany([
  2. { "_id" : 1, "category" : "food", "budget": 400, "spent": 450 },
  3. { "_id" : 2, "category" : "drinks", "budget": 100, "spent": 150 },
  4. { "_id" : 3, "category" : "clothes", "budget": 100, "spent": 50 },
  5. { "_id" : 4, "category" : "misc", "budget": 500, "spent": 300 },
  6. { "_id" : 5, "category" : "travel", "budget": 200, "spent": 650 }
  7. ]);

使用示例:

  1. // $expr: 允许使用聚合表达式,这里以$gt为例,更多表达式参考 https://docs.mongodb.com/manual/meta/aggregation-quick-reference/#aggregation-expressions
  2. db.monthlyBudget.find( { $expr: { $gt: [ "$spent" , "$budget" ] } } )
  3. // $mod: 对字段所在值进行取模运算,显示符合条件的查询,如qty字段值对4取模,并且余数为0
  4. db.inventory.find( { qty: { $mod: [ 4, 0 ] } } )

三、更新(Update Operations)

更新(Update Operations)是对已存在的文档进行修改操作,MongoDB提供以下几种主要更新文档方法:

  • db.collection.update():更新或替换集合中符合条件的一个或多个文档;
  • db.collection.updateOne():只更新集合中符合条件的第一个文档,即使有多个文档(版本3.2新增);
  • db.collection.updateMany():更新集合中所有符合条件的文档(版本3.2新增)。

1. db.collection.update()

根据update指定的表达式可以修改文档中符合条件的字段或代替整个文档。具体的语法格式如下:

  1. db.collection.update(
  2. <query>, //查询表达式
  3. <update>, //更新表达式
  4. {
  5. upsert: <boolean>,
  6. multi: <boolean>,
  7. writeConcern: <document>,
  8. collation: <document>,
  9. arrayFilters: [ <filterdocument1>, ... ],
  10. hint: <document|string> // 版本4.2新增
  11. }
  12. )

参数说明:

  • query:更新文档的查询表达式;如果指定了参数upsert: true并且集合中没有符合查询条件的文档,查询条件中有关于字段_id指定了.分隔符的,并不会插入新的文档;
  • update:主要包含三种格式

    • 1.更新文档:只包含更新操作符表达式;
    • 2.替换文档:只包含<field1>: <value1>对;
    • 3.聚合管道:版本4.2新增,详细参考官方文档。
  • upsert:当query查询条件没符合更新的文档,就新创建文档(可选),默认值为false
  • multi:是否更新多个符合条件的文档(可选),默认值为false,只更新符合条件的第一个文档;
  • writeConcern:参考db.collection.insert()相同参数说明;
  • collation:指定校对规则(可选,版本3.4新增);
  • arrayFilters:文档数组更新过滤操作符(可选,版本3.6新增);
    详细参考:db.collection.update() — MongoDB Manual
  • hint:采用文档或字符串的形式指定适用于查询表达式的索引,如果索引不存在则报错(可选,版本4.2新增)。

使用示例:
使用示例将通过使用两种场景进行,一是没有使用参数选项upsert,二是使用参数选项upsert

  • 不使用选项upsert
  1. // 测试数据
  2. db.books.remove({});
  3. db.books.insertMany([
  4. {
  5. "_id" : 1,
  6. "item" : "TBD",
  7. "stock" : 0,
  8. "info" : { "publisher" : "1111", "pages" : 430 },
  9. "tags" : [ "technology", "computer" ],
  10. "ratings" : [ { "by" : "ijk", "rating" : 4 }, { "by" : "lmn", "rating" : 5 } ],
  11. "reorder" : false
  12. },
  13. {
  14. "_id" : 2,
  15. "item" : "XYZ123",
  16. "stock" : 15,
  17. "info" : { "publisher" : "5555", "pages" : 150 },
  18. "tags" : [ ],
  19. "ratings" : [ { "by" : "xyz", "rating" : 5 } ],
  20. "reorder" : false
  21. }
  22. ]);
  23. /* 使用选项参数 upsert: true
  24. 1、如果查询表达式找到匹配的文档,则执行更新操作;
  25. 2、如果查询表达式没有找到匹配的文档,则执行插入操作;
  26. */
  27. db.books.update(
  28. { item: "ZZZ135" }, // 查询表达式
  29. { // 更新或替换文档
  30. item: "ZZZ135",
  31. stock: 5,
  32. tags: [ "database" ]
  33. },
  34. { upsert: true }
  35. );
  36. // 1.使用更新操作表达式
  37. /* $set操作符
  38. 1、查询表达式指定需要更新的文档 _id;
  39. 2、$inc操作符: stock的字段值+5;
  40. 3、$set操作符: 替换item字段值,替换嵌入文档info的publisher字段值,替换tags字段值,替换数组ratings的第二个元素值
  41. */
  42. db.books.update(
  43. { _id: 1 },
  44. {
  45. $inc: { stock: 5 },
  46. $set: {
  47. item: "ABC123",
  48. "info.publisher": "2222",
  49. tags: [ "software" ],
  50. "ratings.1": { by: "xyz", rating: 3 }
  51. }
  52. }
  53. );
  54. 更新之后的文档:
  55. {
  56. "_id" : 1,
  57. "item" : "ABC123",
  58. "stock" : 5,
  59. "info" : { "publisher" : "2222", "pages" : 430 },
  60. "tags" : [ "software" ],
  61. "ratings" : [ { "by" : "ijk", "rating" : 4 }, { "by" : "xyz", "rating" : 3 } ],
  62. "reorder" : false
  63. }
  64. // 2.为已存在的数组添加元素
  65. // $push操作符: 为指定文档数组ratings添加一个元素
  66. db.books.update(
  67. { _id: 2 },
  68. {
  69. $push: { ratings: { "by" : "jkl", "rating" : 2 } }
  70. }
  71. );
  72. 更新之后的文档:
  73. {
  74. "_id" : 2,
  75. "item" : "XYZ123",
  76. "stock" : 15,
  77. "info" : {
  78. "publisher" : "5555",
  79. "pages" : 150
  80. },
  81. "tags" : [ ],
  82. "ratings" : [
  83. { "by" : "xyz", "rating" : 5 },
  84. { "by" : "jkl", "rating" : 2 }
  85. ],
  86. "reorder" : false
  87. }
  88. // 3.文档移除字段
  89. // $unset操作符: 移除文档的指定字段,为_id:1文档移除tags字段
  90. db.books.update( { _id: 1 }, { $unset: { tags: 1 } } );
  91. 更新后的文档:
  92. {
  93. "_id" : 1,
  94. "item" : "TBD",
  95. "stock" : 0,
  96. "info" : {
  97. "publisher" : "1111",
  98. "pages" : 430
  99. },
  100. "ratings" : [ { "by" : "ijk", "rating" : 4 }, { "by" : "lmn", "rating" : 5 } ],
  101. "reorder" : false
  102. }
  103. // 4.替换整个文档
  104. // 替换_id:2的文档
  105. db.books.update(
  106. { _id: 2 },
  107. {
  108. item: "XYZ123",
  109. stock: 10,
  110. info: { publisher: "2255", pages: 150 },
  111. tags: [ "baking", "cooking" ]
  112. }
  113. );
  114. 更新后的文档:
  115. {
  116. "_id" : 2,
  117. "item" : "XYZ123",
  118. "stock" : 10,
  119. "info" : { "publisher" : "2255", "pages" : 150 },
  120. "tags" : [ "baking", "cooking" ]
  121. }
  122. // 5.更新多个文档
  123. db.books.update(
  124. { stock: { $lte: 10 } },
  125. { $set: { reorder: true } },
  126. { multi: true }
  127. );
  128. 更新后的全部文档:
  129. [
  130. {
  131. "_id" : 1,
  132. "item" : "ABC123",
  133. "stock" : 5,
  134. "info" : {
  135. "publisher" : "2222",
  136. "pages" : 430
  137. },
  138. "ratings" : [ { "by" : "ijk", "rating" : 4 }, { "by" : "xyz", "rating" : 3 } ],
  139. "reorder" : true
  140. }
  141. {
  142. "_id" : 2,
  143. "item" : "XYZ123",
  144. "stock" : 10,
  145. "info" : { "publisher" : "2255", "pages" : 150 },
  146. "tags" : [ "baking", "cooking" ],
  147. "reorder" : true
  148. }
  149. ]
  • 使用upserts选项
  1. /* 使用选项参数 upsert: true
  2. 1、如果查询表达式找到匹配的文档,则执行更新操作;
  3. 2、如果查询表达式没有找到匹配的文档,则执行插入操作;
  4. */
  5. // 1.插入未符合更新条件的文档
  6. db.books.update(
  7. { item: "ZZZ135" },
  8. {
  9. item: "ZZZ135",
  10. stock: 5,
  11. tags: [ "database" ]
  12. },
  13. { upsert: true }
  14. );
  15. 因为集合并未满足条件的文档,则插入的文档为:
  16. {
  17. "_id" : ObjectId("5da78973835b2f1c75347a83"),
  18. "item" : "ZZZ135",
  19. "stock" : 5,
  20. "tags" : [ "database" ]
  21. }
  22. // 2.插入未符合更新条件并且基于更新操作符的文档
  23. // 如果没有符合更新查询条件,并且使用的是更新操作符,则会基于当前的查询条件和更新操作符字段插入新的文档
  24. db.books.update(
  25. { item: "BLP921" },
  26. {
  27. $set: { reorder: false },
  28. $setOnInsert: { stock: 10 }
  29. },
  30. { upsert: true }
  31. );
  32. 新插入的文档为:
  33. {
  34. "_id" : ObjectId("5da79019835b2f1c75348a0a"),
  35. "item" : "BLP921",
  36. "reorder" : false,
  37. "stock" : 10
  38. }
  39. // 3.插入未符合更新条件并且基于聚合管道的文档
  40. // 关于聚合管道请参考官方文档:https://docs.mongodb.com/manual/reference/method/db.collection.update/#update-with-aggregation-pipeline
  41. // 4.插入未符合更新条件并且同时联合多文档操作符的文档
  42. 如果不符合查询条件,则只会插入单个文档
  43. db.books.update(
  44. { "info.publisher": "Self-Published" },
  45. {
  46. $set: { reorder: false, tags: [ "literature", "hardcover" ], stock: 25 }
  47. },
  48. { upsert: true, multi: true }
  49. );
  50. 新插入的文档:
  51. {
  52. "_id" : ObjectId("5db337934f670d584b6ca8e0"),
  53. "info" : { "publisher" : "Self-Published" },
  54. "reorder" : false,
  55. "stock" : 25,
  56. "tags" : [ "literature", "hardcover" ]
  57. }

2. db.collection.updateOne()

根据update指定的参数可以修改文档中符合条件的字段或代替整个文档,与db.collection.update()不同的是每次只更新单个文档。
语法格式如下:

  1. db.collection.updateOne(
  2. <filter>,
  3. <update>,
  4. {
  5. upsert: <boolean>,
  6. writeConcern: <document>,
  7. collation: <document>,
  8. arrayFilters: [ <filterdocument1>, ... ],
  9. hint: <document|string>
  10. }
  11. )

参数说明:
参考db.collection.update()的参数说明。
使用示例:

// 参考db.collection.update()

3. db.collection.updateMany()

根据update指定的参数可以修改文档中符合条件的字段或代替整个文档,与db.collection.updateOne()不同的是更新所有符合条件的文档。
语法格式如下:

  1. db.collection.updateMany(
  2. <filter>,
  3. <update>,
  4. {
  5. upsert: <boolean>,
  6. writeConcern: <document>,
  7. collation: <document>,
  8. arrayFilters: [ <filterdocument1>, ... ],
  9. hint: <document|string>
  10. }
  11. )

参数说明:
参考db.collection.update()的参数说明。
使用示例:

// 参考db.collection.update()

四、删除(Delete Operations)

删除是指对集合当中已存在的文档进行清除操作,MongoDB提供以下几种主要删除文档方法:

  • db.collection.deleteOne():只删除集合中符合条件的一个文档;
  • db.collection.deleteMany():删除集合中所有符合条件的文档;
  • db.collection.remove():删除集合中符合条件的一个或多个文档。

1. db.collection.deleteOne()

根据filter选项条件删除集合中的单个文档,具体语法格式如下:

  1. db.collection.deleteOne(
  2. <filter>,
  3. {
  4. writeConcern: <document>,
  5. collation: <document>
  6. }
  7. )

参数说明:

  • filter:指定基于查询表达式的过滤条件,关于查询表达式可以查看db.collecion.find()中的<query>
  • writeConcern:参考db.collection.insert()相同参数说明;
  • collation:指定校对规则(可选,版本3.4新增);

使用示例:

  1. // 删除指定条件的单个文档
  2. db.orders.deleteOne( { "_id" : 1 } );
  3. { "acknowledged" : true, "deletedCount" : 1 }

2. db.collection.deleteMany()

根据filter选项条件删除集合中的单个文档,具体语法格式如下:

  1. db.collection.deleteMany(
  2. <filter>,
  3. {
  4. writeConcern: <document>,
  5. collation: <document>
  6. }
  7. )

参数说明:参考db.collection.deleteOne()的参数说明。
使用示例:

  1. // 删除指定条件的多个文档
  2. db.orders.deleteMany( {"cust_id" : "Cam Elot"} );
  3. { "acknowledged" : true, "deletedCount" : 2 }

注意: 如果是对固定集合进行删除文档操作则会报错,固定集合的清除操作使用方法db.collection.drop()

五、总结

  1. 本文简单梳理了在Mongo Shell下基本的CRUD操作,主要适用于DBA的运维管理,如果是研发同学,根据不同的编程语言使用不同客户端驱动进行操作,详细同样可以参考官方文档;
  2. 针对CRUD各个方面还有其他一些额外的方法,比如查询修改文档方法db.collection.findAndModify(),这里只是总结每个文档操作中一些最基础的方法,对于额外高级的方法这里不再赘述;
  3. 掌握了这些基本的CRUD操作,就可以对MongoDB文档进行操作了,但还是需要控制好权限,毕竟数据安全不是小事,做变更之前做好数据的备份,以防万一。

本文转自:MongoDB 4.X CRUD 基本操作说明-阿里云开发者社区

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/56025
推荐阅读
相关标签
  

闽ICP备14008679号