mongodb - 计算数组中元素的数量

标签 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" } ] }

我已使用 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/

相关文章:

mongodb - 使用 Golang 和 mgo 从 Collection MongoDB 中获取元素

javascript - 如何将 : Pass node. js mongodb 结果转换为 angularjs?

使用 Monger 的 MongoDB 连接模式

http - Go:http文件上传

json - MongoDB 使用 bson.Raw 从查询中返回整个 JSON

go - GetById 和 CreateOrUpdate 不起作用

javascript - 我在我的 Node.js 应用程序中使用 MongoSkin,在一段时间不活动后,它失去了与数据库的连接

python - 转换 python 列表以进行 mongodb 导入时出现问题

go - 我可以在一个 go 模块中包含多个包吗?如何?

mongodb - 使用 Golang mgo.v2 的嵌套 MongoDB 查询