Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 如何在Mongo中实现post标记?_Mongodb - Fatal编程技术网

Mongodb 如何在Mongo中实现post标记?

Mongodb 如何在Mongo中实现post标记?,mongodb,Mongodb,我正在玩弄Mongo来做一个非常喜欢的项目,我想实现post标签。每个标记都有一个名称和一个slug(在URL中用作id的字符串),一篇文章有多个标记。我希望能够创建类似“查找带有标记A但没有标记B的帖子”这样的查询,我想知道mongo是如何做到这一点的 一种方法是在每篇文章中存储一个标签ID数组——这将使上述查询变得简单,但需要为每篇文章额外存储一个标签ID来获取标签名和slug。另一种方法是在每篇文章中存储一个[tag name,tag slug]数组,但我不确定我能否在查找中使用该信息 是

我正在玩弄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对于在数据库中搜索很重要,它消除了使用正则表达式(重音、小写/大写、空格、破折号等)的必要性。