Amazon DocumentDB 基础语法 #

一、Mongo Shell基础 #

1.1 启动Shell #

bash
# 基本连接
mongo --host my-cluster.cluster-abc123.us-east-1.docdb.amazonaws.com \
      --port 27017 \
      --username admin \
      --password \
      --ssl

# 使用连接字符串
mongo "mongodb://admin:password@my-cluster.cluster-abc123.us-east-1.docdb.amazonaws.com:27017/?ssl=true&replicaSet=rs0"

1.2 Shell提示符 #

javascript
// 默认提示符
>

// 显示当前数据库
rs0:PRIMARY>

// 自定义提示符
prompt = function() {
  return db.getName() + "> ";
}

1.3 常用Shell命令 #

javascript
// 显示帮助
help

// 数据库操作
show dbs              // 显示所有数据库
use mydb              // 切换数据库
db                    // 显示当前数据库
db.dropDatabase()     // 删除当前数据库

// 集合操作
show collections      // 显示所有集合
db.createCollection("users")  // 创建集合
db.users.drop()       // 删除集合

// 查看集合统计
db.users.stats()
db.users.dataSize()
db.users.indexStats()

二、数据库操作 #

2.1 创建数据库 #

javascript
// DocumentDB在首次插入数据时创建数据库
use mydb

// 插入数据后数据库才真正创建
db.users.insertOne({ name: "张三" })

// 查看数据库
show dbs

2.2 切换数据库 #

javascript
// 切换到指定数据库
use mydb

// 查看当前数据库
db.getName()

2.3 删除数据库 #

javascript
// 删除当前数据库
use mydb
db.dropDatabase()

// 输出
{ "dropped": "mydb", "ok": 1 }

三、集合操作 #

3.1 创建集合 #

javascript
// 显式创建
db.createCollection("users")

// 带选项创建
db.createCollection("logs", {
  capped: false,
  max: 10000,
  size: 5242880
})

// 隐式创建(插入时自动创建)
db.products.insertOne({ name: "商品A" })

3.2 查看集合 #

javascript
// 显示所有集合
show collections

// 获取集合列表
db.getCollectionNames()

// 查看集合详情
db.users.stats()

3.3 删除集合 #

javascript
// 删除集合
db.users.drop()

// 输出
true

3.4 重命名集合 #

javascript
// 重命名集合
db.users.renameCollection("customers")

// 跨数据库重命名(不支持)
// DocumentDB不支持跨数据库重命名

四、文档插入 #

4.1 插入单个文档 #

javascript
// insertOne
db.users.insertOne({
  name: "张三",
  age: 30,
  email: "zhangsan@example.com",
  createdAt: new Date()
})

// 返回结果
{
  "acknowledged": true,
  "insertedId": ObjectId("65a1b2c3d4e5f67890123456")
}

4.2 插入多个文档 #

javascript
// insertMany
db.users.insertMany([
  {
    name: "李四",
    age: 25,
    email: "lisi@example.com"
  },
  {
    name: "王五",
    age: 28,
    email: "wangwu@example.com"
  }
])

// 返回结果
{
  "acknowledged": true,
  "insertedIds": [
    ObjectId("65a1b2c3d4e5f67890123457"),
    ObjectId("65a1b2c3d4e5f67890123458")
  ]
}

4.3 插入选项 #

javascript
// 有序插入(遇到错误停止)
db.users.insertMany(
  [
    { _id: 1, name: "用户1" },
    { _id: 1, name: "用户2" },  // 重复ID
    { _id: 2, name: "用户3" }
  ],
  { ordered: true }
)

// 无序插入(继续插入其他文档)
db.users.insertMany(
  [
    { _id: 1, name: "用户1" },
    { _id: 1, name: "用户2" },
    { _id: 2, name: "用户3" }
  ],
  { ordered: false }
)

五、文档查询 #

5.1 基本查询 #

javascript
// 查询所有文档
db.users.find({})

// 格式化输出
db.users.find({}).pretty()

// 查询特定字段
db.users.find({ name: "张三" })

// 查询单个文档
db.users.findOne({ name: "张三" })

5.2 查询操作符 #

javascript
// 比较操作符
db.products.find({ price: { $eq: 100 } })      // 等于
db.products.find({ price: { $ne: 100 } })      // 不等于
db.products.find({ price: { $gt: 100 } })      // 大于
db.products.find({ price: { $gte: 100 } })     // 大于等于
db.products.find({ price: { $lt: 100 } })      // 小于
db.products.find({ price: { $lte: 100 } })     // 小于等于
db.products.find({ price: { $in: [100, 200] } })  // 在列表中
db.products.find({ price: { $nin: [100, 200] } }) // 不在列表中

// 逻辑操作符
db.users.find({
  $and: [
    { age: { $gte: 18 } },
    { status: "active" }
  ]
})

db.users.find({
  $or: [
    { role: "admin" },
    { role: "superuser" }
  ]
})

db.users.find({
  age: { $not: { $lt: 18 } }
})

db.users.find({
  $nor: [
    { status: "deleted" },
    { status: "banned" }
  ]
})

// 元素操作符
db.users.find({ email: { $exists: true } })
db.users.find({ age: { $type: "int" } })

// 数组操作符
db.users.find({ tags: "编程" })                    // 数组包含
db.users.find({ tags: { $all: ["编程", "阅读"] } }) // 包含所有
db.users.find({ tags: { $size: 3 } })              // 数组长度
db.users.find({ tags: { $elemMatch: { $gt: 5 } } }) // 数组元素匹配

5.3 投影 #

javascript
// 包含字段
db.users.find(
  { name: "张三" },
  { name: 1, email: 1 }
)

// 排除字段
db.users.find(
  { name: "张三" },
  { password: 0, createdAt: 0 }
)

// 数组切片
db.posts.find(
  {},
  { comments: { $slice: 5 } }  // 前5条评论
)

db.posts.find(
  {},
  { comments: { $slice: [10, 5] } }  // 跳过10条,取5条
)

// 数组元素匹配
db.users.find(
  {},
  { grades: { $elemMatch: { $gte: 80 } } }
)

5.4 排序和分页 #

javascript
// 排序
db.users.find({}).sort({ age: 1 })      // 升序
db.users.find({}).sort({ age: -1 })     // 降序
db.users.find({}).sort({ age: -1, name: 1 })  // 多字段排序

// 分页
db.users.find({}).skip(0).limit(10)     // 第1页
db.users.find({}).skip(10).limit(10)    // 第2页
db.users.find({}).skip(20).limit(10)    // 第3页

// 计数
db.users.countDocuments({})
db.users.countDocuments({ status: "active" })

// 去重
db.users.distinct("city")

六、文档更新 #

6.1 更新操作符 #

javascript
// $set - 设置字段值
db.users.updateOne(
  { name: "张三" },
  { $set: { age: 31, city: "上海" } }
)

// $unset - 删除字段
db.users.updateOne(
  { name: "张三" },
  { $unset: { tempField: "" } }
)

// $inc - 数值增减
db.products.updateOne(
  { _id: 1 },
  { $inc: { stock: -1 } }
)

// $mul - 数值乘法
db.products.updateOne(
  { _id: 1 },
  { $mul: { price: 1.1 } }
)

// $rename - 重命名字段
db.users.updateOne(
  { name: "张三" },
  { $rename: { "oldName": "newName" } }
)

// $setOnInsert - 仅在插入时设置
db.users.updateOne(
  { _id: 1 },
  { $setOnInsert: { createdAt: new Date() } },
  { upsert: true }
)

6.2 数组更新操作符 #

javascript
// $push - 添加数组元素
db.users.updateOne(
  { name: "张三" },
  { $push: { tags: "新标签" } }
)

// $push带选项
db.users.updateOne(
  { name: "张三" },
  {
    $push: {
      scores: {
        $each: [90, 85, 88],
        $sort: -1,
        $slice: 5
      }
    }
  }
)

// $pull - 删除匹配元素
db.users.updateOne(
  { name: "张三" },
  { $pull: { tags: "旧标签" } }
)

// $pullAll - 删除多个元素
db.users.updateOne(
  { name: "张三" },
  { $pullAll: { tags: ["标签1", "标签2"] } }
)

// $addToSet - 添加唯一元素
db.users.updateOne(
  { name: "张三" },
  { $addToSet: { tags: "新标签" } }
)

// $pop - 删除首尾元素
db.users.updateOne(
  { name: "张三" },
  { $pop: { tags: 1 } }  // 1删除最后一个,-1删除第一个
)

// $ - 更新第一个匹配元素
db.users.updateOne(
  { "grades.grade": 85 },
  { $set: { "grades.$.comment": "良好" } }
)

6.3 更新方法 #

javascript
// updateOne - 更新一个文档
db.users.updateOne(
  { name: "张三" },
  { $set: { age: 31 } }
)

// updateMany - 更新多个文档
db.users.updateMany(
  { status: "pending" },
  { $set: { status: "active" } }
)

// replaceOne - 替换整个文档
db.users.replaceOne(
  { _id: 1 },
  { name: "张三", age: 30, city: "北京" }
)

// findOneAndUpdate - 查找并更新
db.users.findOneAndUpdate(
  { name: "张三" },
  { $inc: { loginCount: 1 } },
  { returnDocument: "after" }
)

// upsert选项
db.users.updateOne(
  { email: "new@example.com" },
  { $set: { name: "新用户" } },
  { upsert: true }
)

七、文档删除 #

7.1 删除方法 #

javascript
// deleteOne - 删除一个文档
db.users.deleteOne({ name: "张三" })

// deleteMany - 删除多个文档
db.users.deleteMany({ status: "inactive" })

// findOneAndDelete - 查找并删除
db.users.findOneAndDelete(
  { name: "张三" },
  { sort: { createdAt: -1 } }
)

// 删除所有文档
db.users.deleteMany({})

7.2 删除选项 #

javascript
// 带写关注删除
db.users.deleteOne(
  { _id: 1 },
  { writeConcern: { w: "majority" } }
)

// 带条件删除
db.users.deleteMany({
  createdAt: { $lt: new Date("2023-01-01") }
})

八、批量操作 #

8.1 bulkWrite #

javascript
// 批量操作
db.users.bulkWrite([
  {
    insertOne: {
      document: { name: "用户1", age: 25 }
    }
  },
  {
    updateOne: {
      filter: { name: "用户2" },
      update: { $set: { age: 26 } }
    }
  },
  {
    deleteOne: {
      filter: { name: "用户3" }
    }
  },
  {
    replaceOne: {
      filter: { name: "用户4" },
      replacement: { name: "用户4", age: 27 }
    }
  }
])

8.2 批量操作选项 #

javascript
// 有序批量操作
db.users.bulkWrite([...], { ordered: true })

// 无序批量操作
db.users.bulkWrite([...], { ordered: false })

// 带写关注
db.users.bulkWrite([...], {
  ordered: false,
  writeConcern: { w: "majority" }
})

九、命名规范 #

9.1 数据库命名 #

text
数据库命名规则:
├── 不能包含:/\. "$*<>:|?
├── 不能以"system."开头
├── 长度限制:64字节
├── 区分大小写
└── 建议:使用小写和下划线

9.2 集合命名 #

text
集合命名规则:
├── 不能包含:$ 或 null
├── 不能以"system."开头
├── 不能包含点号(嵌套除外)
├── 长度限制:120字节
├── 区分大小写
└── 建议:使用复数形式

9.3 字段命名 #

text
字段命名规则:
├── 不能包含:.
├── 不能以$开头
├── 区分大小写
├── _id为保留字段
└── 建议:使用驼峰命名

十、总结 #

10.1 常用命令速查 #

操作 命令
显示数据库 show dbs
切换数据库 use dbname
显示集合 show collections
插入文档 insertOne/insertMany
查询文档 find/findOne
更新文档 updateOne/updateMany
删除文档 deleteOne/deleteMany
创建索引 createIndex
查看索引 getIndexes

10.2 操作符速查 #

类型 操作符
比较 $eq, $ne, $gt, $gte, $lt, $lte, $in, $nin
逻辑 $and, $or, $not, $nor
元素 $exists, $type
数组 $all, $elemMatch, $size
更新 $set, $unset, $inc, $push, $pull, $addToSet

下一步,让我们学习数据库操作!

最后更新:2026-03-27