MongoDB如何设计多对多的关系
比如说文章和Tag,在SQL下可以这么设计
Post: Id Title Tag: Id Name Relation: PostId TagID
那么,如果用MongoDB的思想,该如何设计这种关系呢?
在查询方面这些语句又该怎样写:
- 列出所有Tag
- 列出所有文章及其Tag
- 列出某Tag下的所有文章
黑猫即是正义
10 years, 11 months ago
Answers
结构:
一个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的数量。
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"});
亦然奏效。
╲午夜秣班車
answered 10 years, 11 months ago