使用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的每一项内容都必须与数据库中的一致才能删除成功,对于复杂点的对象显然不适用。
相关推荐
首先,我们看一个示例数据源,其中包含两个文档,每个文档都有一个`uid`、`name`字段以及一个名为`addrs`的数组,数组中的每个元素包含`is_query`和`city`字段: ```json { "_id": ObjectId("5bbcc0c9a74db9804e78...
在mgo部分,作者讲解了Go语言中的mgo库,包括Rich MongoDB Driver等内容。 在godis部分,作者讲解了Go语言中的godis库,包括Redis Client等内容。 在snappy部分,作者讲解了Go语言中的snappy库,包括Compress/...
这种方式的匹配主体是数组本身,意味着它会查找数组中存在一个单独的子文档,该子文档同时满足所有的匹配条件。例如,以下查询将返回所有 `qList` 数组中包含一个 `qid` 为 1 且 `reorderFlag` 为 0 的子文档: ``...
以上两种情况的聚合统计,分别对应与聚合框架中的 $group 操作步骤和 $project 操作步骤。 1.$group 直接看例子吧。 Case 1 测试集合mycol中的数据如下: { title: 'MongoDB Overview', description: 'MongoDB is...
此外,还可以使用`$exists`检查字段是否存在,`$regex`进行正则表达式匹配,以及`$elemMatch`针对数组中的元素进行匹配。 MongoDB 的查询系统使其能处理复杂的数据模型,适应各种应用场景,无论是简单的单键查询...
本文主要关注MongoDB中对文档的增删改查操作,这些操作是数据库管理的基础。 **插入文档** MongoDB 提供了多种方法来插入文档。`insert()` 命令用于插入单个或多个文档。如果集合不存在,MongoDB会自动创建它。例如...
`getInstance`方法检查`$mongodb_arr`静态数组中是否存在对应的实例,如果不存在或者`$flag['force']`为`true`,就会创建一个新的`HMongodb`对象。 `connect`方法用于实际建立与MongoDB的连接。如果连接成功,返回`...
查询MongoDB文档时,我们可以使用`db.collection.find()`方法。该方法接受两个参数,第一个参数是查询条件,第二个参数可以用来指定返回文档中哪些键(key)应该被包含或排除。 1. 查询指定键: - 如果想要显示...
MongoDB 是一种流行的开源NoSQL数据库,以分布式文件存储为核心,使用C++语言开发,特别适合Web应用的数据存储。在MongoDB中,索引扮演着至关重要的角色,它类似于传统的关系型数据库,通过B-Tree数据结构加速数据...
4. **文档**:在`mongo-go-driver`中,文档由`bson.Document`表示,它是键值对的集合,支持嵌套结构和多种数据类型,包括基本类型、数组、子文档等。 5. **查询和过滤**:通过`mongo.Filter`,开发者可以构建复杂的...
MongoDB提供了丰富的操作符,如`$inc`(增量更新)、`$push`(向数组中添加元素)等,使得对文档的修改变得非常灵活。对于开发者来说,了解并熟练掌握这些操作符是十分重要的,以便在实际开发中高效地管理和更新数据...
它遍历输入的文档数组并逐个插入。 `findOne()`方法用于查询一条记录: ```php public function findOne($where = NULL) { if (NULL === $where) { // ... } else { // ... } } ``` 此方法接受一个可选的查询...
MongoDB是一个基于分布式文件存储的文档数据库,可以说是非关系型(NoSQL,Not Only SQL)数据库中比较像关系型数据库的一个,具有免费、操作简单、面向文档、自动分片、可扩展性强、查询功能强大等特点,对大数据...
首先,Go语言,也被称为Golang,是Google在2009年推出的一种静态类型的编译型语言。它的设计目标是提高开发效率,提供高效的并发处理能力,以及简洁的语法。Go语言的核心特性包括垃圾回收、C风格的语法、类型系统、...
这些操作符使得在 MongoDB 中更新文档时具有很高的灵活性,可以根据需求进行复杂的数据更新。 总结来说,`update()` 方法适用于更新特定条件下的文档,可以控制是否插入新文档以及更新多条记录。而 `save()` 方法则...
列出数据库中的所有“概要文件”收集文档 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使用,以及如何通过Go语言的mgo驱动进行操作。 1. **BSON数据类型与结构体映射** BSON支持多种数据类型,包括字符串、数字、日期、布尔值、数组、对象ID等。在Go语言中,我们可以...
但MongoDB 提供了一些原子操作,确保在单个文档级别的数据一致性。 原子操作是数据库操作的基本概念,指的是一个操作要么全部完成,要么全部不完成,不会出现部分完成的状态。在MongoDB中,以下操作被视为原子的: ...