如何在 MongoDB 中限制删除以进行关系收集

Sag*_*jan 1 mongoose mongodb mongoose-schema

例如,我们可以考虑以下模型:

Companies {Name: string, Address:string}

Employees {FirstName: string, 
           lastName:String, 
           Company: {type:mongoose.schema.objectID,ref:companies}
}
Run Code Online (Sandbox Code Playgroud)

需要限制删除在数据库级别拥有员工记录的公司,而不使用“预”中间件。

我正在寻找一些类似于 MySQL 关系约束的解决方案 - 删除限制。

Cle*_*ath 6

我们可以使用$nin做到这一点

让我们有 3 条记录的公司集合

db.companies.find();

{"_id":1, "name":"ABC Pvt Ltd", "Address":"Chennai, India"}
{"_id":2, "name":"XYZ Pvt Ltd", "Address":"Mumbai, India"}
{"_id":3, "name":"LMN Pvt Ltd", "Address":"Delhi, India"}
Run Code Online (Sandbox Code Playgroud)

让我们有 3 条记录的员工集合,员工集合中的公司属性指的是公司集合的文档 ID,为了测试,我们有公司 1 和 2 的员工。

db.employees.find();

{"_id":1, "firstname":"X", "lastname":"Y", "company":1}
{"_id":2, "firstname":"A", "lastname":"B", "company":1}
{"_id":2, "firstname":"Z", "lastname":"A", "company":2}
Run Code Online (Sandbox Code Playgroud)

在删除没有任何员工的公司之前,首先我们需要找到有员工的公司。为了避免多个条目,让我们使用不同的

db.employees.distinct("company")
[ 1, 2 ]
Run Code Online (Sandbox Code Playgroud)

现在我们已经将 $nin 用于有员工的不同公司,以删除没有员工的公司

db.companies.remove({"_id":{$nin : db.employees.distinct("company")}});
Run Code Online (Sandbox Code Playgroud)

现在,如果我们对公司集合执行查找查询,我们将只得到两条记录。

db.companies.find();
{ "_id" : 1, "name" : "ABC Pvt Ltd", "Address" : "Chennai, India" }
{ "_id" : 2, "name" : "XYZ Pvt Ltd", "Address" : "Mumbai, India" }
Run Code Online (Sandbox Code Playgroud)

公司 3 被删除,因为它没有员工

希望能帮助到你!