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

本文探讨了NoSQL数据库中数组的有效使用方法,特别是在多对多关系的数据组织方面。通过具体的例子介绍了如何维护文章和标签之间的关系,并讨论了在数组较大时的操作性能问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数组在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吧 ->:)!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值