1、第一种联合删除
db.collection.aggregate([
{
$lookup: {
from: "带刷新数据源表-test1",
localField: "devCode",
foreignField: "oldDevCode",
as: "matching_docs"
}
},
{
$unwind: "$matching_docs"
},
{
$set: {
"devCode": "$matching_docs.newDevCode"
}
},
{
$unset: "matching_docs"
},
{
$merge: {
into: "被刷新的表-test2",
on: "_id", // 或者其他唯一标识符字段
whenMatched: "replace",
whenNotMatched: "insert"
}
}
])
解释:
这是一个MongoDB的聚合查询,主要用于将`test2`集合中的数据与`test1`集合进行联接(lookup),并更新`semp_fault_active`集合中的某些字段。以下是这段聚合查询的详细解释:
- **$lookup**:
* **from**: 指定要联接的集合,这里是`test1`。
* **localField**: 指定`test2`集合中的哪个字段用于联接,这里是`devCode`。
* **foreignField**: 指定`a_rep_dev`集合中的哪个字段用于联接,这里是`oldDevCode`。
* **as**: 指定联接后的结果存放在哪个字段中,这里是`matching_docs`。
* 结果:每个`semp_fault_active`文档都会有一个`matching_docs`字段,其中包含了与`devCode`匹配的`a_rep_dev`中的所有文档。
- **$unwind**:
* 用于将`matching_docs`数组中的每个文档拆分为单独的文档。这意味着如果`matching_docs`中有n个文档,那么原始文档就会被拆分成n个文档。
- **$set**:
* 用于更新`devCode`字段的值。这里,它将`devCode`的值设置为`matching_docs`数组中的`newDevCode`字段的值。
- **$unset**:
* 用于删除`matching_docs`字段,因为我们在之后的操作中不再需要它。
- **$merge**:
* 这是一个非常有用的操作,它允许你将聚合的结果合并回一个集合。
* **into**: 指定要合并到的集合,这里是`semp_fault_active`。
* **on**: 指定用于匹配的唯一标识符字段,这里是`_id`。这意味着,如果`semp_fault_active`中已经有一个文档具有相同的`_id`,那么该文档将被更新(根据`whenMatched`参数)。
* **whenMatched**: 指定当文档在目标集合中存在时应该如何处理。这里,选择的是"replace",意味着匹配到的文档将被替换为聚合的结果。
* **whenNotMatched**: 指定当文档在目标集合中不存在时应该如何处理。这里,选择的是"insert",意味着非匹配的文档将被插入到目标集合中。
总之,这段聚合查询的主要目的是将`semp_fault_active`集合中的`devCode`字段更新为`a_rep_dev`集合中相应的`newDevCode`字段的值,并将结果合并回`semp_fault_active`集合。如果`_id`字段在`semp_fault_active`集合中已经存在,则替换该文档;如果不存在,则插入新文档。
2、第二种:单表批量删除
bash
db.tableName.deleteMany({ "orderCode": { $in: ['DW-1401-20240329-5124678656000',
'DW-1409-20240329-6089991168000',
'DW-1410-20240327-6157379584000',
'DW-1410-20240327-5389821952000',
'DW-1410-20240327-4504823808000'
] } })