今天的新知识

web development

我今天做的第一件事就是复习一下我的 mongodb 知识,因为它是我高级 Web 开发课程的重要组成部分。我今天学到的关键概念是:

MongoDB 上的简单 CURD 操作

插入单个文档 --> **db.collection.insertOne()**;

插入多个文档 --> **db.collection.insertMeny()**;

查找单个文档 --> **db.collection.findOne()**;

查找多个文档 --> **db.collection.find()**;

更新单个文档 --> **db.collection.updateOne()**;

更新多个文档 --> **db.collection.updateMeny()**;

删除单个文档 --> **db.collection.deleteOne()**;

删除多个文档 --> **db.collection.deleteMany()**;

MongoDB 比较运算符

MongoDB 比较运算符允许您通过比较字段值来过滤文档。

`$eq:` 匹配等于指定值的值。

`$ne:` 匹配不等于指定值的值。

`$gt:` 匹配大于指定值的值。

`$gte:` 匹配大于或等于指定值的值。

`$lt:` 匹配小于指定值的值。

`$lte:` 匹配小于或等于指定值的值。

`$in:` 匹配数组中指定的任何值。

`$nin:` 不匹配数组中指定的任何值。

假设我们有一个名为用户的集合,其文档结构如下:

{ "_id": 1, "name": "Alice", "age": 25, "status": "A" }
{ "_id": 2, "name": "Bob", "age": 30, "status": "B" }
{ "_id": 3, "name": "Charlie", "age": 35, "status": "A" }
{ "_id": 4, "name": "David", "age": 28, "status": "C" }
{ "_id": 5, "name": "Eve", "age": 40, "status": "B" }
{ "_id": 6, "name": "Frank", "age": 22, "status": "A" }

现在,让我们进行一个显示每个比较运算符的查询。

//method one
db.users.find({
  $and: [
// Find documents where "age" is exactly 25
    { age: { $eq: 25 } },          
// and where "age" is NOT 30
    { age: { $ne: 30 } },           
// and where "age" is greater than 20
    { age: { $gt: 20 } },           
// and where "age" is 25 or higher
    { age: { $gte: 25 } },          
// and where "age" is less than 40
    { age: { $lt: 40 } },           
// and where "age" is 35 or lower
    { age: { $lte: 35 } },          
// and where "status" is either "A" or "B"
    { status: { $in: ["A", "B"] } }, 
// and where "status" is NOT "C" or "D"
    { status: { $nin: ["C", "D"] } } 
  ]
})

//method two
db.users.find({age: {$eq:25, $ne:30, $gt: 20, $gte: 25, $lt:40, $lte: 35}, status:{$in:["A", "B"], $nin:["C","D"]} })

//output:
{ "_id": 1, "name": "Alice", "age": 25, "status": "A" }

方法一是显式“与”方法

方法二是隐式“and”方法

MongoDB 的逻辑运算符

MongoDB 的逻辑运算符允许您组合和操作查询中的条件。

MongoDB 中的 `$and` 运算符允许您在单个查询中组合多个条件。

MongoDB 中的 `$or` 运算符允许您返回满足至少一个条件的文档。

MongoDB 中的 `$nor` 运算符允许您返回不符合指定条件的文档。

MongoDB 中的 `$not` 运算符反转条件的效果,返回与指定条件不匹配的文档。

现在,让我们进行一个显示每个逻辑运算符的查询。

db.users.find({
  $and: [
    { $or: [{ status: "A" }, { age: { $lt: 25 } }] },
    { age: { $gt: 20 } },
    { age: { $not: { $gt: 35 } } },
    { $nor: [{ status: "B" }, { age: 30 }] }
  ]
})

//output
{ "_id": 1, "name": "Alice", "age": 24, "status": "A" }
{ "_id": 3, "name": "Charlie", "age": 28, "status": "A" }
{ "_id": 6, "name": "Frank", "age": 22, "status": "A" }

MongoDB 的元素运算符

`$exists`:检查文档中是否存在某个字段。

`$type`:检查文档中是否存在所提到的类型。

现在,让我们进行一个显示每个逻辑运算符的查询。

db.users.find({ "age": { $type: "int" } })
 db.users.find({ "status": { $exists: true } })

//output
[
{ "_id": 1, "name": "Alice", "age": 25, "status": "A" },
{ "_id": 2, "name": "Bob", "age": 30, "status": "B" },
{ "_id": 3, "name": "Charlie", "age": 35, "status": "A" },
{ "_id": 4, "name": "David", "age": 28, "status": "C" },
{ "_id": 5, "name": "Eve", "age": 40, "status": "B" },
{ "_id": 6, "name": "Frank", "age": 22, "status": "A" }
]

MongoDB 的数组运算符

`$all`:匹配包含所有指定元素的数组。

`$elemMatch`:根据指定的标准匹配数组内的元素。

`$size`:匹配具有指定数量元素的数组。

假设我们有一个名为 students 的集合,其文档结构如下:

[
  { "_id": 1, "name": "Alice", "grades": [85, 90, 92], "subjects": ["Math", "English", "History"] },
  { "_id": 2, "name": "Bob", "grades": [78, 80, 85], "subjects": ["Math", "Science", "English"] },
  { "_id": 3, "name": "Charlie", "grades": [95, 98, 93], "subjects": ["Math", "History"] },
  { "_id": 4, "name": "David", "grades": [60, 70, 68], "subjects": ["Math", "Science"] }
]

现在,让我们进行一个显示每个数组运算符的查询。

db.students.find({
  "grades": { $elemMatch: { $gt: 90 } }
})
//output 
[
  { "_id": 1, "name": "Alice", "grades": [85, 90, 92], "subjects": ["Math", "English", "History"] },
  { "_id": 3, "name": "Charlie", "grades": [95, 98, 93], "subjects": ["Math", "History"] }
]

db.students.find({
  "subjects": { $size: 3 }
})
//output 
[
  { "_id": 1, "name": "Alice", "grades": [85, 90, 92], "subjects": ["Math", "English", "History"] },
  { "_id": 2, "name": "Bob", "grades": [78, 80, 85], "subjects": ["Math", "Science", "English"] }
]

db.students.find({
  "subjects": { $all: ["Math", "History"] }
})
//output 
[
  { "_id": 1, "name": "Alice", "grades": [85, 90, 92], "subjects": ["Math", "English", "History"] },
  { "_id": 3, "name": "Charlie", "grades": [95, 98, 93], "subjects": ["Math", "History"] }
]

这些运算符在数组和对象填充的情况下很有用

MongoDB 的更新运算符

MongoDB 提供了几个更新操作符,允许您修改集合中的现有文档。

`$set`:用于更新字段的值。如果该字段不存在,则会创建它。

`$unset`:用于从文档中删除字段。

`$addToSet`:仅当值在数组中尚不存在时才将值添加到数组中(类似于集合)。

`$push`:向数组字段添加值。如果该字段不存在,则将其创建为数组。

`$each`:运算符与 `$push` 和 `$addToSet` 运算符结合使用,在单个更新操作中向数组字段添加多个元素。

`$pop`:删除数组的第一个或最后一个元素。1 用于删除最后一个元素,-1 用于删除第一个元素。

`$pull`:从数组中删除符合指定条件的值的所有实例。

`$pullAll`:运算符用于从数组字段中删除多个特定值。

`$rename`:重命名文档中的字段。

现在,让我们进行一个显示每个更新操作符的查询。

db.students.updateOne(
  { "_id": 2 },{  $set: { "graduated": false } }
)

//output 
{ "_id": 2, "name": "Bob", "grades": [78, 80, 85], "subjects": ["Math", "Science", "English"], "graduated": false },

db.students.updateOne(
  { "_id": 2 }, { $unset: { "subjects": "" }}
)

//output
{ "_id": 2, "name": "Bob", "grades": [78, 80, 85], "graduated": false },

db.students.updateOne(
  { "_id": 2 }, { $addToSet: { "subjects": "Geography" }}
)

//output
{ "_id": 1, "name": "Alice", "grades": [85, 90, 92], "subjects": ["Math", "English", "History","Geography"] },

db.students.updateOne(
  { "_id": 1 }, { $push: { "grades": 88 }}
)

//output
{ "_id": 1, "name": "Alice", "grades": [85, 90, 92, 88], "subjects": ["Math", "English", "History","Geography"] }

db.students.updateOne(
  { "_id": 1 }, { $push: { "grades": { $each: [ 91, 82] }}}
)

//output
{ "_id": 1, "name": "Alice", "grades": [85, 90, 92, 88, 91, 82], "subjects": ["Math", "English", "History","Geography"] }

db.students.updateOne(
  { "_id": 1 },{  $pop: { "grades": 1 } // 1 for the last element, -1 for the first element }
)

//output
{ "_id": 1, "name": "Alice", "grades": [85, 90, 92, 88, 91], "subjects": ["Math", "English", "History","Geography"] }

db.students.updateOne(
  { "_id": 1 },{ $pull: { "grades": 90 }}
)

//output
{ "_id": 1, "name": "Alice", "grades": [85, 92, 88, 91], "subjects": ["Math", "English", "History","Geography"] }

db.students.updateOne(
  { "_id": 1 }, { $pullAll: { "grades": [80, 92] }}
)
//output
{ "_id": 1, "name": "Alice", "grades": [85, 88, 91], "subjects": ["Math", "English", "History","Geography"] }

db.students.updateOne(
  { "_id": 1 },{ $rename: { "name": "firstName" }}
)
//output
{ "_id": 1, "firstName": "Alice", "grades": [85, 88, 91], "subjects": ["Math", "English", "History","Geography"] }