Mongodb,问题很简单
我是mongo的新手,这是我的db设计:Mongodb,问题很简单,mongodb,Mongodb,我是mongo的新手,这是我的db设计: product := { name: str group: ref, comments: [ ref, ref, ref, ref ] } comments := { ... a bunch of comments stuff } tag := { _id: int, #Need this for online requests tag: str, product
product := {
name: str
group: ref,
comments: [ ref, ref, ref, ref ]
}
comments := {
... a bunch of comments stuff
}
tag := {
_id: int, #Need this for online requests
tag: str,
products: [ {product: ref, score: float}, ... ],
comments: [ {comment: ref, score: float}, ...],
}
因此,我的使用模式是:
给定一个产品,查找具有特定标签的注释并相应地对其进行排序
我目前的做法包括:
效率很低。有更好的方法吗?我不确定我是否理解您试图正确执行的操作,但是如果每个注释都可以有多个标记,并且是单个产品上的注释,那么您可以使每个注释都有标记和产品字段。然后,您的评论文档将如下所示:
comment := {
product: product_id,
tags: [tag1, tag2, ... ]
...
}
然后,给定一个产品,您可以执行以下操作:
db.comments.find({product : productId, tags : myTag})
这种方法如此低效的原因是,您确实设计了数据库,使这个过程效率低下 您将“tags”集合构建为“comments”集合的父级。但是你说你想通过“标签”加载“评论” 通常在标记“评论”或“产品”时,“标签”属于“评论”或“产品”。但您已经颠倒了这一点,您正在引用来自标记的注释,而不是按标记查找注释 我想你要找的是更像这样的东西
- 产品包含注释
- 产品可以贴标签
- 可以标记注释
- 所有标签都有分数
product := {
name: str,
group: ref,
tags: [ {ref, score}, {ref, score},... ]
comments: [ { ref, tags: [ {ref, score}, {ref, score},... ] },
{ ref, tags: [ {ref, score}, {ref, score},... ] }, ...
]
}
如果您想更进一步,甚至可以完全删除“comments”集合。没有产品的评论,可能没有任何意义。因此,您可以在产品“对象”中创建整个注释“对象”
从“索引”的角度来看,您可以在数组中建立索引。因此,您可以在product.tags和product.comments.tags上设置索引
现在您的查询更容易了。你可以直接抓取一个产品,然后在评论数组中循环寻找合适的标签。或者,您可以运行查询服务器端,让它按分数排序标记