我正在玩弄Mongo来做一个非常喜欢的项目,我想实现post标签.每个标记都有一个名称和一个slug(在URL中用作id的字符串),一篇文章有多个标记.我希望能够创建类似"查找带有标记A但没有标记B的帖子"这样的查询,我想知道mongo是如何做到这一点的.

一种方法是在每篇帖子中存储一个标签ID数组——这将使上述查询变得简单,但需要在每篇帖子中额外存储一个标签ID来获取标签名和slug.另一种方法是在每篇帖子中存储一个[tag name,tag slug]数组,但我不确定我是否能在find中使用这些信息.

还有其他方法对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"
        },
    ]
}

然后,您可以使用dot notation来查询带有特定标记的帖子,如下所示:

db.test.find({ "tags.name" : "meta"})

因为tags是一个数组,所以mongo足够聪明,可以将查询与数组中的任何元素相匹配,而不是与整个数组相匹配,而点表示法允许您与特定字段相匹配.

要查询包含特定标签的帖子not,请使用$ne:

db.test.find({ "tags.name" : { $ne : "fish" }})

要查询包含一个标记但不包含另一个标记的帖子,请使用$and:

db.test.find({ $and : [{ "tags.name" : { $ne : "fish"}}, {"tags.name" : "meta"}]})

希望这有帮助!

Mongodb相关问答推荐

MongoDB—基于数组中同一文档中的另一个字段更新字段

映射数组值并查找每个匹配的集合

如何使用内部数组中的值更新文档

定期自动轮换 MongoDb 集合

MongoDB - 家庭作业(job)帮助.不确定如何在 mongodb 中访问文档中的变量

使用golang的MongoDB错误无法访问服务器

Mongodb按值分组并计算出现次数

如何在 2 个应用程序之间共享mongoose模型?

Springboot 使用 find*() 查询时出现 Mongodb 错误

字段类型在 MongoDB 索引中是否重要?

`fields cannot be identical'和''` mongoimport错误

使用 MongoDB 进行嵌套分组

MongoDB GridFS VS 直接磁盘 IO

为什么使用 Redis 而不是 MongoDb 进行缓存?

如何在mongoDB中检索其值以特定字符结尾的文档

mongodb安装失败运行mongod

MongoDb:聚合 $lookup 过滤外部文档

如何使用 mongodb-java-driver 进行 upsert

MongoDB Compass:select distinct field values

全局初始化失败:BadValue Invalid or no user locale set.请确保正确设置 LANG 和/或 LC_* 环境变量