如何$取消设置整个对象,而不是在MongoDB中保留为空或空值

我有以下update query ,它将带走object的内容,但它empty 。 我想摆脱整个对象{}

我怎样才能做到这一点? 我也试过,指定propertiesvalue而不是booleans ,这给了我相同的result

如果我这样做{ $unset: { "courses.1.teachers.1": 1 } ,那么给我null而不是{} 。 所以没有一个是最佳的。

 student.updateStudent = (fcallback) => { var studentObjectId = global.mongoId("5a019896f89c24926108e2bf") global.db.collection('students').updateOne({ "_id": studentObjectId }, { $unset: { "courses.1.teachers.1.firstName": 1, "courses.1.teachers.1.lastName": 1 } }, (err, result) => { if (err) { var jError = { "status": "error", "message": "ERROR -> user.js -> 001" } console.log(jError) return fcallback(true, jError) } var jOk = { "status": "ok", "message": "user.js -> deleted -> 000" } console.log(jOk) console.log(JSON.stringify(result)) return fcallback(false, jOk) }) } 

这是留下一个空的对象的结果:

 { "_id" : ObjectId("5a019896f89c24926108e2bf"), "firstName" : "Sarah", "lastName" : "Jepsen", "age" : 27, "courses" : [ { "courseName" : "Web-development", "teachers" : [ { "firstName" : "Santiago", "lastName" : "Donoso" } ] }, { "courseName" : "Databases", "teachers" : [ { "firstName" : "Dany", "lastName" : "Kallas" }, {} //see here ] }, { "teachers" : [ { "firstName" : "Roxana", "lastName" : "Stolniceanu" } ] } ] } 

我想要的是这样的:

 { "_id" : ObjectId("5a019896f89c24926108e2bf"), "firstName" : "Sarah", "lastName" : "Jepsen", "age" : 27, "courses" : [ { "courseName" : "Web-development", "teachers" : [ { "firstName" : "Santiago", "lastName" : "Donoso" } ] }, { "courseName" : "Databases", "teachers" : [ { "firstName" : "Dany", "lastName" : "Kallas" } ] }, { "teachers" : [ { "firstName" : "Roxana", "lastName" : "Stolniceanu" } ] } ] } 

根据$unset文档 ,这是所需的行为:

当和$一起用来匹配一个数组元素时,$ unset用nullreplace匹配元素,而不是从数组中移除匹配的元素。 这种行为保持数组大小和元素位置一致。

所以你正在使用错误的工具来完成这项工作。

正确的工具:

  1. $pop操作符:删除第一个或最后一个数组元素
  2. $pull操作符:根据条件移除项目

文件为例:

 { "_id" : ObjectId("5a019896f89c24926108e2bf"), "firstName" : "Sarah", "lastName" : "Jepsen", "age" : 27, "courses" : [ { "courseName" : "Web-development", "teachers" : [ { "firstName" : "Santiago", "lastName" : "Donoso" } ] }, { "courseName" : "Databases", "teachers" : [ { "firstName" : "Dany", "lastName" : "Kallas" }, { "firstName": "Code", "lastName": "Dragon" } ] }, { "teachers" : [ { "firstName" : "Roxana", "lastName" : "Stolniceanu" } ] } ] } 

例子1: $pop

 global.db .collection('students') .updateOne( { _id : studentObjectId }, { $pop: { "courses.1.teachers": 1 } } // 1 for last item, -1 for the first ) 

例2: $pull

 global.db .collection('students') .updateOne( { _id : studentObjectId }, { $pull: { "courses.1.teachers": { firstName: 'Code' } } } )