计算数组

时间:2016-08-03 04:34:14

标签: mongodb go mgo

我正在创建一个应用程序,它有一个从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中创建一个解决方法,但我想在没有任何解决方法的情况下离开。

我希望我不会错过一些非常微不足道的事情。

谢谢!

2 个答案:

答案 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以获取更多详细信息),这可以自动返回已修改的文档,检查数组是否为空并且用另一个查询取消它。