我正在创建一个应用程序,它有一个函数,可以从 MongoDB 集合中文档内的数组中删除元素。
我需要一种方法,在删除操作后数组立即变空时立即取消设置数组的字段。我需要这样做,以便可以区分具有非空数组的文档和具有空数组的文档。
例如,现在我的 section
集合如下所示:
db.section.find({})
{ "_id" : ObjectId("57a0a38ad1c6ef24376477c5"), "sectionid" : "BTE4B",
"sectionname" : "BTech 4B", "year" : 4,
"session" : 2016, "courseid" : "BTE-CS", "password" : "pm8xTE0-",
"students" : 35, "addedon" : "2016-08-02 19:13:38", "teachers" : [ ] }
{ "_id" : ObjectId("57a0a96bd1c6ef24376477cd"), "sectionid" : "BTE4D",
"sectionname" : "BTech 4D", "year" : 4, "session" : 2016, "courseid" :
"BTE-CS", "password" : "sHhKr0Ov", "students" : 41, "addedon" :
"2016-08-02 19:38:43", "teachers" : [ { "facultyid" : "CS-102",
"subjectid" : "CS-ALGO" } ] }
我已使用 mgo 对第一个文档的 teachers
数组应用了 $pull 操作,但我需要一种方法当它变空时$unset
它。
目前,我已经设法在 Go 中创建了一个解决方法,但我想在没有任何解决方法的情况下离开。
我希望我没有在这里遗漏一些非常琐碎的事情。
谢谢!
最佳答案
建议使用 findAndModify()
API 执行 $pull
首先更新操作,这将返回修改后的文档,然后您可以访问教师数组进行检查。检查数组是否为空后,您可以发出另一个调用 $unset
的更新操作。如果数组键有零个元素,则在教师字段上使用 运算符。
mongo shell 中的规范示例如下:
change = db.section.findAndModify({
query: { "sectionid": "BTE4D", "teachers.facultyid": "CS-102" },
update: { "$pull": { "teachers": { "facultyid" : "CS-102" } } },
new: true
});
printjson(change);
if (!change.teachers[0]) {
db.section.update(
{ "_id": change._id },
{ "$unset": { "teachers": "" } }
);
}
db.section.find({ "_id": change._id })
使用 mgo 实现此功能,您需要 Query.Apply
方法本质上包装了 findAndModify
MongoDB 命令
change := mgo.Change{
Update: bson.M{"$pull": bson.M{"teachers": bson.M{"facultyid": "CS-102"}}},
ReturnNew: true,
}
info, err = col.Find(M{"sectionid": "BTE4D"}).Apply(change, &doc)
fmt.Println(doc.N)
关于mongodb - 计算数组中元素的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38734485/