`
三月沙
  • 浏览: 619506 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

mongodb 中使用数组建立多对多关系

阅读更多

数组在nosql数据库中扮演着特别的角色,某些场景下使用数组将会特别方便,例如如下场景

  • 数据量较小,十万以下
  • 有多对多的关系存在
  • 包含正反向查询
  • 不频繁更新数组中的数据

例如博客文章中的标签,可能会有一篇文章包含多个标签,一个标签对应多篇文章

tag --> [
    article1,
    article2,
    article3,
    article4
]

article --> [
    tag1,
    tag2,
    tag3,
    tag4,
]

在这种场景下,可能会需要利用标签查询特定文章,以及反向查询:查询文章包含的标签,在nosql数据库中完全可以使用数组来组织这种多对多的关系

考虑设计collection 结构,文章collection:article,标签collection:article2tag

article {
    title:'',
    content:'',
    tag:[],
    atime:''
}

article2tag {
    tag:''
    articleList:[],
    atime:'',
    size:0
}

article的tag键是数组类型,值为单个article的标签 article2tag的articleList键是数组类型,值为包含此标签的文章

每次文章添加新标签的时候,更新文章和标签的对应关系

#!/usr/bin/env python
#更新文章标签
db.article.update({'_id':article_id},{'$set':{'tag':tags}})

#在二者对应关系中清除之前该文章的所有关系,使用数组的$pull操作,及删除该文章和标签的所有关系,并将数组长度减小1
db.article2tag.update({'article2list':article_id},{'$pull':{'articleList':article_id},'$inc':{'size':-1}},multi=True)

#建立新的关系
for i in tags:
    db.article2tag.update({'tag':i},{'$push':{'article2list':article_id},'$inc':{'size':1}})

#清除不包含文章的标签
db.article2tag.remove({'size':{'$lte':0}},multi=True)

注意

当数组变得很大时,$push和$pull对性能将产生比较大的影响,所以在使用$push和$pull的场景中一定是小数据量且不发生频繁更新的场景,如果你的数组会变得很大,那么考虑把数组中的数据单独提取为一个collection吧 ->:)!

0
1
分享到:
评论

相关推荐

    Laravel开发-mongodb-relations

    4. **多对多(Many to Many)**:在MongoDB中,多对多关系通常通过内嵌文档或者使用单独的关联集合实现。可以使用`morphToMany`、`morphedByMany`或自定义查询来实现。 5. **内嵌文档(Embedded Documents)**:在...

    MongoDB详解加实例

    MongoDB中的数据是以文档的形式存储在集合(Collection)中,文档由键值对组成,类似于JSON对象。一个集合可以看作是关系数据库中的表,而文档则相当于行。例如,一个用户集合可能包含多个用户文档,每个文档包含了...

    Mongodb入门教程、示例+Spring Boot完整示例+聚合.docx

    在 MongoDB 中,可以建立多个数据库。常用操作包括: 1. Help 查看命令提示:db.help(); 2. 切换/创建数据库:use test 如果数据库不存在,则创建数据库,否则切换到指定数据库。 3. 查询所有数据库:show dbs; 4. ...

    MongoDB中文用户手册.pdf

    - **数据建模**:相较于传统关系型数据库中将数据分布在多个表中,MongoDB 更倾向于将相关数据存储在同一文档内,以简化查询操作。 #### 四、MongoDB 架构的关键组件 - **_id 字段**:每条文档都必须包含一个 `_id`...

    11-Spring-Boot(十一):Spring boot中mongodb的使用.docx

    MongoDB 是一种流行的开源NoSQL数据库,以高性能、高可用性和...而Spring Boot简化了与MongoDB的集成,使得在Java应用中使用MongoDB变得更加方便。在实际项目中,开发者应根据具体需求和业务场景选择合适的数据库技术。

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

    在PHP中,MongoDB是一个广泛使用的NoSQL数据库,它的特点是数据存储格式为JSON-like文档,提供了灵活的数据模型。为了方便地操作MongoDB数据库,开发者通常会编写数据库操作类,如这里的`HMongodb`。这个类提供了对...

    Mongodb索引的优化

    在MongoDB中,索引扮演着至关重要的角色,它类似于传统的关系型数据库,通过B-Tree数据结构加速数据查找和排序。 ### 一、索引简介 MongoDB 的索引可以通过`ensureIndex()`函数创建,指定一个或多个字段来提升查询...

    tp加mongodb留言板

    1. 建立留言表:在MongoDB中,创建一个名为`messages`的集合,用于存储留言数据,字段可能包括`_id`(MongoDB自动生成的ID)、`content`(留言内容)、`username`(用户名)、`timestamp`(时间戳)等。 2. 添加...

    MongoDB底层类生成器

    在关系型数据库中,我们通常会使用ORM(对象关系映射)框架来简化数据操作,而在MongoDB这样的NoSQL数据库中,虽然没有严格的表格结构,但类似的辅助类也可以提高开发效率。DBHelper类就是这样一个工具,它封装了与...

    MONGODB的索引探究

    MongoDB的索引是数据库性能优化的关键因素,与MySQL、Oracle等关系型数据库中的索引原理相似,但具有自身的特性和限制。MongoDB的索引建立在Collection(表)级别,采用B-树数据结构来加速查询和排序操作。 1. 默认...

    MongoDB Driver -JAVA 2.5.3 API

    - **Insert**: 可以使用`insertOne()`或`insertMany()`方法将单个或多个文档插入到集合中。 - **Find**: `find()`方法用于查询集合中的文档。可以使用过滤器、投影和排序来定制查询。此外,`findOne()`返回单个匹配...

    MongoDB原版手册

    对于数据建模,手册中可能会提供一些特定于MongoDB应用的数据建模考虑因素,比如如何在文档之间建立一对一、一对多以及多对多关系。此外,还包括了用于原子操作的数据建模模式,树状结构(包括使用父引用、子引用、...

    MongoDB环境下GML云存储构建

    MongoDB的每个数据库包含多个集合(Collections),每个集合包含多个文档(Documents),这些文档相当于关系型数据库中的行。 在构建GML云存储时,需要关注的关键点包括: 1. **GML云存储数据类型**:在MongoDB...

    深入云计算 MongoDB管理与开发实战详解pdf.part1

    注重实战,通过实际中的案例为读者讲解使用MongoDB时遇到的各种问题,并给出了解决方案。本书旨在帮助云计算初学者迅速掌握MongoDB数据库,提升读者在云计算实践中的应用和开发能力。同时本书极强的系统性和大量翔实...

    NoSQL数据库MongoDB基础学习

    MongoDB 的索引类似关系型数据库,MongoDB 可以对某个字段建立索引,可以建立组合索引、唯一索引,也可以删除索引。 MongoDB 没有自动递增或序列特性,当 BSON 对象插入到数据库中时,如果没有提供“_id”字段,...

    MongoDB 55 道面试题及答案.docx

    为什么在 MongoDB 中使用 "Object ID" 数据类型? "ObjectID" 数据类型用于存储文档 id。ObjectID 由四部分组成:时间戳、客户端 ID、客户进程 ID、三个字节的增量计数器。 在 MongoDB 中什么是索引? 索引用于...

    MongoDB权威指南(中文版)高清

    15111.2.4 评论树 15211.2.5 投票 15311.3 自定义提交表单:Ruby 15411.3.1 安装Ruby驱动 15411.3.2 使用Ruby驱动 15511.3.3 自定义表单提交 15511.3.4 Ruby的对象映射和在Rails中使用MongoDB 15711.4...

Global site tag (gtag.js) - Google Analytics