我正在创建一个应用程序,它有一个从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" } ] }
我在第一个文档的teachers
数组中使用 mgo 应用了 $ pull 操作,但我需要一种方法$unset
当它变空时。
目前,我已设法在Go中创建一个解决方法,但我想在没有任何解决方法的情况下离开。
我希望我不会错过一些非常微不足道的事情。
谢谢!
答案 0 :(得分:1)
建议先使用 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)
答案 1 :(得分:1)
要将空数组与非空数组区分开,可以将find命令与$size运算符一起使用。
如果您选择删除空数组,可以使用MongoDB findAndModify发出$ pull运算符(请参阅mgo documentation以获取更多详细信息),这可以自动返回已修改的文档,检查数组是否为空并且用另一个查询取消它。