【问题标题】:MongoDB: get documents by tagsMongoDB:按标签获取文档
【发布时间】:2011-10-19 21:49:33
【问题描述】:

我有包含 tags 数组的文档。我想在网站上提供基于标签的建议,所以我需要获取包含相同标签的文档 + 不匹配 1 个标签的文档 + 不匹配 2 个标签的文档等等......

我该怎么做?

【问题讨论】:

  • 鉴于你在下面所说的这个问题还不清楚。也许所需输出的示例会有所帮助

标签: mongodb tags


【解决方案1】:

示例集合:

db.tags.insert({"tags":["red", "tall", "cheap"]});
db.tags.insert({"tags":["blue", "tall", "expensive"]});
db.tags.insert({"tags":["blue", "little", "cheap"]}); 

找出所有包含“蓝色”标签的内容

db.tags.find({tags: { $elemMatch: { $eq: "blue" } }})

找到所有标记为“蓝色”的,只有蓝色的

db.tags.find({tags: "blue"})

找到所有标记为“蓝色”和“便宜”的东西

db.tags.find({ tags: { $all: ["cheap", "blue"] } } )

找出所有不是“蓝色”的

db.tags.find({tags: { $ne: "blue" } })

找到所有“蓝色”和“便宜”,但不是“红色”而不是“高”

在我的 mongo 数据库中不可能。从 mongodb 1.9.1 开始,这样的东西应该可以工作,虽然(未经测试):

db.tags.find({ $and: [ {tags: { $all: ["blue", "cheap"] } }, { tags: { $nin: ["red", "tall"] } } ] })

【讨论】:

  • 你不明白。我不需要完全匹配。我希望所有文档至少包含一个按其包含的原始标签计数排序的标签。
  • 那么您是否愿意更准确地提出问题?
  • 使用$in 运算符查找一些但不是$all,这个答案误导我相信$all 的行为类似于$in docs.mongodb.org/v3.0/reference/operator/query/in/#op._S_in
【解决方案2】:

改写后的问题是:

假设招聘信息是否附加了搜索标签,例如

招聘信息

[{_id : ObjectId(1249999493),tags : ['Location1', 'SkillSet1', 'SkillSet2', 'Someother1', 'Someother2']},
 {_id : ObjectId(1249999494),tags : ['Location3', 'SkillSet1', 'SkillSet0', 'Someother4', 'Someother3']}]

现在,他想要标签为 ['Location1','SkillSet1', 'SkillSet0']的记录

并且从查询中选择的具有更多关键字的文档应该排在第一位。较少的关键字匹配应该排在最后。因此,该人可以获得更适合搜索查询的职位发布。

我是明智的还是我需要重新措辞?

【讨论】:

  • 这对我来说是正确的。似乎 4 岁的问题 更多的是谈论过滤结果而不是创建搜索参数。
  • @nilsi 是的,这不是一个答案,但我试图用一个场景来解释这个问题。
【解决方案3】:

步骤:

  1. 查找包含任何指定键的匹配产品。

  2. 在按键上展开

  3. 展开后再次查找过滤不需要的东西

  4. 通过添加键出现对它们进行分组

  5. 按降序排序以首先获得最相关的

[{ "$match" : { "keys" : { "$in" : [ { "$regex" : "text" , "$options" : "i"}]}}}, { "$unwind " : "$keys"}, { "$match" : { "keys" : { "$in" : [ { "$regex" : "text" , "$options" : "i"}]}}}, {“$group”:{“_id”:{“productId”:“$productId”},“relatedTags”:{“$sum”:1}}},{“$sort”:{“relatedTags”:-1 }},{ "$limit" : 10}]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-25
    • 2017-02-17
    • 2012-12-11
    • 1970-01-01
    • 2014-02-02
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多