Mongodb 如何在Mongo中实现post标记?
我正在玩弄Mongo来做一个非常喜欢的项目,我想实现post标签。每个标记都有一个名称和一个slug(在URL中用作id的字符串),一篇文章有多个标记。我希望能够创建类似“查找带有标记A但没有标记B的帖子”这样的查询,我想知道mongo是如何做到这一点的 一种方法是在每篇文章中存储一个标签ID数组——这将使上述查询变得简单,但需要为每篇文章额外存储一个标签ID来获取标签名和slug。另一种方法是在每篇文章中存储一个[tag name,tag slug]数组,但我不确定我能否在Mongodb 如何在Mongo中实现post标记?,mongodb,Mongodb,我正在玩弄Mongo来做一个非常喜欢的项目,我想实现post标签。每个标记都有一个名称和一个slug(在URL中用作id的字符串),一篇文章有多个标记。我希望能够创建类似“查找带有标记A但没有标记B的帖子”这样的查询,我想知道mongo是如何做到这一点的 一种方法是在每篇文章中存储一个标签ID数组——这将使上述查询变得简单,但需要为每篇文章额外存储一个标签ID来获取标签名和slug。另一种方法是在每篇文章中存储一个[tag name,tag slug]数组,但我不确定我能否在查找中使用该信息 是
查找中使用该信息
是否有其他方法更适合mongo?我是NoSQL的新手,所以我非常感谢您对如何实现这一点的建议。另外,我正在使用PHP绑定,但这可能不重要。如果您使用的标记及其各自的slug不太可能更改,我认为您的第二种方法是更好的。但是,我建议进行一个小的更改—不要存储一个[name,slug]
数组,而是通过创建一个标记子文档来明确字段,如本例中的post
文档:
{
"_id" : ObjectId("4ee33229d8854784468cda7e"),
"title" : "My Post",
"content" : "This is a post with some tags",
"tags" : [
{
"name" : "meta",
"slug" : "34589734"
},
{
"name" : "post",
"slug" : "34asd97x"
},
]
}
然后,您可以使用如下点符号查询带有特定标记的帖子:
db.test.find({ "tags.name" : "meta"})
因为tags
是一个数组,所以mongo非常聪明,可以将查询与数组中的任何元素相匹配,而不是与整个数组相匹配,并且点表示法允许您与特定字段相匹配
要查询不包含特定标记的帖子,请使用$ne
:
db.test.find({ "tags.name" : { $ne : "fish" }})
要查询包含一个标记但不包含另一个标记的帖子,请使用$和:
db.test.find({ $and : [{ "tags.name" : { $ne : "fish"}}, {"tags.name" : "meta"}]})
希望这有帮助 是否需要在标签中添加段塞?或者仅仅拥有一个值数组可以吗?我认为slug恰好是OPs方法的一个实现细节。你不需要它。有没有一个查询会返回所有标签(比如如果你想做一个标签云)?编辑:看起来这可能有用:索引呢?slug对于在数据库中搜索很重要,它消除了使用正则表达式(重音、小写/大写、空格、破折号等)的必要性。