您好,匿名用户
随意问技术百科期待您的加入

MongoDB如何设计多对多的关系

0 投票

比如说文章和Tag,在SQL下可以这么设计

Post:
    Id
    Title

Tag:
    Id
    Name

Relation:
    PostId
    TagID

那么,如果用MongoDB的思想,该如何设计这种关系呢?

在查询方面这些语句又该怎样写:

  1. 列出所有Tag
  2. 列出所有文章及其Tag
  3. 列出某Tag下的所有文章
用户头像 提问 2012年 12月1日 @ Lux 上等兵 (267 威望)
分享到:

1个回答

0 投票
 
最佳答案

结构:
一个post collection

{
    _id:"505830c6bff31ae281080cad",
    title:"test title",
    tags:["tag1","tag2"]
}
列出所有Tag
db.post.distinct("tags")
返回数据:
[ "tag1", "tag2", "tag3" ]

结构简单的做法是使用 mongodo 的 distinct 语法,但是性能不好说(感觉是属于一种简单的MapReduce)。
在数据量大的情况下如果性能达不到要求也可以再加一个tags的collection,在每次增删改的时候对tags collection进行inc操作,顺带统计了tag的数量。

列出所有文章及其Tag
db.post.find({});
返回数据:
{ "_id" : ObjectId("505b1406a015193d051e8878"), "title" : "test title", "tags" : [ "tag1", "tag2" ] }
{ "_id" : ObjectId("505b140ea015193d051e8879"), "title" : "test title2", "tags" : [ "tag1", "tag3" ] }

就能得到上面所有文章和tag

列出某Tag下的所有文章
db.post.find({tags:{$in:["tag2"]}});
返回数据:
{ "_id" : ObjectId("505b1406a015193d051e8878"), "title" : "test title", "tags" : [ "tag1", "tag2" ] }

另外发现过一种更简洁的方式:

db.post.find({tags:"tag2"});

亦然奏效。

用户头像 回复 2012年 12月1日 @ Nocturne 上等兵 (262 威望)
选中 2012年 12月1日 @Lux
提一个问题:

相关问题

0 投票
1 回复 47 阅读
用户头像 提问 2012年 12月1日 @ Apple 上等兵 (542 威望)
0 投票
1 回复 52 阅读
用户头像 提问 2012年 12月1日 @ Talon 上等兵 (294 威望)
0 投票
1 回复 42 阅读
用户头像 提问 2012年 12月1日 @ Caitlyn 上等兵 (452 威望)
0 投票
1 回复 45 阅读
0 投票
1 回复 98 阅读

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...