`

go语言中mongodb的子文档数组操作

阅读更多

    使用mongodb数据库的同学应该会经常遇到document中子文档数组的操作,开始没弄明白之前感觉挺费神,后来查了些资料,自己摸索了一下,特此记录下来,以供参考;
本文描述的 Go语言 代码使用了labix.org/v2/mgo驱动
假设有一个图文类News,它的内容包含了文字和图片,或者纯粹是多张图片,结构如下:

type News struct{
    Id int64 `bson:"_id"`
    Title string
    Content NewsContent
}

type NewsContent struct{
    Id int64
    Title string
    Content string
    Images []Image
    Type int
}

type Image struct{
    Id int64
    Url string
    Width int
    Height int
    Mark string
}

 

一个图文的内容可以包含很多张图片,那么后台发布图文的内容时,图片可能需要单独进行增删改操作,这就涉及到子文档数组的操作,类似下面代码:
 

//AddNewsImg 增加图片
func (this *NewsDao) AddNewsImg(newsId int64, img *Image) (err error) {
    session := this.GetSession()
    query := bson.M{"_id": newsId}
    update := bson.M{"$push": bson.M{"content.images": img}}
    err = session .Update(query, update)
    return
}

 


//UpdateNewsImg 更新图片
func (this *NewsDao) UpdateNewsImg(newsId int64, img *Image) (err error) {
    session := this.GetSession()
    query := bson.M{"_id": newsId, "content.images.id": img.Id}
    update := bson.M{"$set": bson.M{"content.images.$": img}}
    err = session .Update(query, update)
    return
}

 
这里$符合代表当前找到的Image,然后使用set更新,也可以单独一项一项的更新,如:update := bson.M{"$set": bson.M{"content.images.$.url": img.Url,"content.images.$.width": img.Width}}

//DeleteNewsImg 删除图片
func (this *NewsDao) DeleteNewsImg(newsId int64, img *Image) (err error) {
    session := this.GetSession()
    query := bson.M{"_id": newsId}
    update := bson.M{"$pull": bson.M{"content.images": bson.M{"id": img.Id}}}
    err = session .Update(query, update)
    return
}

 
这里是按特殊条件进行删除的:update := bson.M{"$pull": bson.M{"content.images": bson.M{"id": img.Id}}} 其中bson.M{"id": img.Id}指的是按照数组中某一张图片的id进行删除;
网上很多文章都是按整个对象进行删除,这样要求传入的img的每一项内容都必须与数据库中的一致才能删除成功,对于复杂点的对象显然不适用。

分享到:
评论

相关推荐

    mongodb如何对文档内数组进行过滤的方法步骤

    首先,我们看一个示例数据源,其中包含两个文档,每个文档都有一个`uid`、`name`字段以及一个名为`addrs`的数组,数组中的每个元素包含`is_query`和`city`字段: ```json { "_id": ObjectId("5bbcc0c9a74db9804e78...

    Go语言学习笔记.pdf 共174页

    在mgo部分,作者讲解了Go语言中的mgo库,包括Rich MongoDB Driver等内容。 在godis部分,作者讲解了Go语言中的godis库,包括Redis Client等内容。 在snappy部分,作者讲解了Go语言中的snappy库,包括Compress/...

    MongoDB如何对数组中的元素进行查询详解

    这种方式的匹配主体是数组本身,意味着它会查找数组中存在一个单独的子文档,该子文档同时满足所有的匹配条件。例如,以下查询将返回所有 `qList` 数组中包含一个 `qid` 为 1 且 `reorderFlag` 为 0 的子文档: ``...

    MongoDB 中聚合统计计算–$SUM表达式

    以上两种情况的聚合统计,分别对应与聚合框架中的 $group 操作步骤和 $project 操作步骤。 1.$group 直接看例子吧。 Case 1 测试集合mycol中的数据如下: { title: 'MongoDB Overview', description: 'MongoDB is...

    MongoDB_文档_查询

    此外,还可以使用`$exists`检查字段是否存在,`$regex`进行正则表达式匹配,以及`$elemMatch`针对数组中的元素进行匹配。 MongoDB 的查询系统使其能处理复杂的数据模型,适应各种应用场景,无论是简单的单键查询...

    MongoDB数据库文档操作方法(必看篇)

    本文主要关注MongoDB中对文档的增删改查操作,这些操作是数据库管理的基础。 **插入文档** MongoDB 提供了多种方法来插入文档。`insert()` 命令用于插入单个或多个文档。如果集合不存在,MongoDB会自动创建它。例如...

    PHP实现的MongoDB数据库操作类分享

    `getInstance`方法检查`$mongodb_arr`静态数组中是否存在对应的实例,如果不存在或者`$flag['force']`为`true`,就会创建一个新的`HMongodb`对象。 `connect`方法用于实际建立与MongoDB的连接。如果连接成功,返回`...

    MongoDB快速入门笔记(四)之MongoDB查询文档操作实例代码

    查询MongoDB文档时,我们可以使用`db.collection.find()`方法。该方法接受两个参数,第一个参数是查询条件,第二个参数可以用来指定返回文档中哪些键(key)应该被包含或排除。 1. 查询指定键: - 如果想要显示...

    Mongodb索引的优化

    MongoDB 是一种流行的开源NoSQL数据库,以分布式文件存储为核心,使用C++语言开发,特别适合Web应用的数据存储。在MongoDB中,索引扮演着至关重要的角色,它类似于传统的关系型数据库,通过B-Tree数据结构加速数据...

    开源项目-mongodb-mongo-go-driver.zip

    4. **文档**:在`mongo-go-driver`中,文档由`bson.Document`表示,它是键值对的集合,支持嵌套结构和多种数据类型,包括基本类型、数组、子文档等。 5. **查询和过滤**:通过`mongo.Filter`,开发者可以构建复杂的...

    MongoDB修改、删除文档的域属性实例

    MongoDB提供了丰富的操作符,如`$inc`(增量更新)、`$push`(向数组中添加元素)等,使得对文档的修改变得非常灵活。对于开发者来说,了解并熟练掌握这些操作符是十分重要的,以便在实际开发中高效地管理和更新数据...

    php实现的mongodb操作类

    它遍历输入的文档数组并逐个插入。 `findOne()`方法用于查询一条记录: ```php public function findOne($where = NULL) { if (NULL === $where) { // ... } else { // ... } } ``` 此方法接受一个可选的查询...

    Python操作MongoDb数据库流程详解

    MongoDB是一个基于分布式文件存储的文档数据库,可以说是非关系型(NoSQL,Not Only SQL)数据库中比较像关系型数据库的一个,具有免费、操作简单、面向文档、自动分片、可扩展性强、查询功能强大等特点,对大数据...

    go 学习(成长之路) 这是一本学习Go 语言的教程,设计基础语法、redis、mongo、mysql、restfu.zip

    首先,Go语言,也被称为Golang,是Google在2009年推出的一种静态类型的编译型语言。它的设计目标是提高开发效率,提供高效的并发处理能力,以及简洁的语法。Go语言的核心特性包括垃圾回收、C风格的语法、类型系统、...

    MongoDB 更新文档

    这些操作符使得在 MongoDB 中更新文档时具有很高的灵活性,可以根据需求进行复杂的数据更新。 总结来说,`update()` 方法适用于更新特定条件下的文档,可以控制是否插入新文档以及更新多条记录。而 `save()` 方法则...

    nlp_text_classifier:工作正在进行中。 Golang提取“概要文件”,这些概要文件是来自文档的最小化词源数组,并将其存储在MongoDB中。 可以通过组合配置文件来创建分类配置文件。 一旦存在分类配置文件,应通过将新文件的配置文件与现有分类配置文件进行比较来对新文档进行“分类”

    列出数据库中的所有“概要文件”收集文档 curl "http://127.0.0.1:12345/profiles/db/{database name}" 通过其ID字符串从数据库返回配置文件对象 curl "http://127.0.0.1:12345/db/{database_name}/id/{id}" 发送r

    mongodb BSON的基本使用教程

    本教程将详细介绍MongoDB中的BSON使用,以及如何通过Go语言的mgo驱动进行操作。 1. **BSON数据类型与结构体映射** BSON支持多种数据类型,包括字符串、数字、日期、布尔值、数组、对象ID等。在Go语言中,我们可以...

    MongoDB 原子操作

    但MongoDB 提供了一些原子操作,确保在单个文档级别的数据一致性。 原子操作是数据库操作的基本概念,指的是一个操作要么全部完成,要么全部不完成,不会出现部分完成的状态。在MongoDB中,以下操作被视为原子的: ...

Global site tag (gtag.js) - Google Analytics