MongoDB:通过标签获取文档

MongoDB:通过标签获取文档,mongodb,tags,Mongodb,Tags,我有包含标记的文档数组。我想在网站上提供基于标签的建议,所以我需要获得包含相同标签的文档+与1个标签不匹配的文档+与2个标签不匹配的文档,等等 如何做到这一点?示例集合: db.tags.insert({"tags":["red", "tall", "cheap"]}); db.tags.insert({"tags":["blue", "tall", "expensive"]}); db.tags.insert({"tags":["blue", "little", "cheap"]}); 查

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

如何做到这一点?

示例集合:

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: "blue"})
查找所有标记为“蓝色”和“便宜”的

查找所有非“蓝色”

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

在我的mongo db中不可能。从mongodb 1.9.1开始,类似的功能应该可以工作,但是(未经测试):

步骤:

  • 查找包含任何指定密钥的匹配产品

  • 按键展开

  • 展开后,请再次查找以过滤不需要的内容

  • 通过添加关键字引用对它们进行分组

  • 首先对desc进行排序以获得最相关的内容


  • [{“$match”:{“keys”:{“$in”:[{“$regex”:“text”,“$options”:“i”}}},{“$unwind”:“$keys”},{“$match”:{“keys”:{“$in”:[{“$regex”:“text”,“$options”:“i”}}}}},{“$group”:{“\u id”:{“productId”:“$productId”},“relatedTags”:{“$sum”:“$sum”:“{“$sum”:“:{1}”,“relatedTags”:{重新表述的问题是:

    假设职位公告是否附加了搜索标签,如

    职位公告

    [{_id : ObjectId(1249999493),tags : ['Location1', 'SkillSet1', 'SkillSet2', 'Someother1', 'Someother2']},
     {_id : ObjectId(1249999494),tags : ['Location3', 'SkillSet1', 'SkillSet0', 'Someother4', 'Someother3']}]
    
    现在,他希望记录具有标记['Location1'、'SkillSet1'、'SkillSet0']

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


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

    你没有想到。我不需要精确匹配。我希望所有文档至少包含一个标记,并按其包含的原始标记计数排序。您是否希望更精确地表述问题?使用
    $in
    运算符查找一些标记,而不是
    $all
    ,这个答案误导了我,使我相信
    $all
    的行为就像
    $in
    中的行为,因为你在下面所说的这个问题并不清楚。也许一个理想输出的例子会对我有帮助。似乎4年前的问题更多的是关于过滤结果,而不是创建搜索参数。@nilsi是的,这不是答案,但我试图用一个场景来解释这个问题。
    db.tags.find({ tags: { $all: ["cheap", "blue"] } } )
    
    db.tags.find({tags: { $ne: "blue" } })
    
    db.tags.find({ $and: [ {tags: { $all: ["blue", "cheap"] } }, { tags: { $nin: ["red", "tall"] } } ] })
    
    [{_id : ObjectId(1249999493),tags : ['Location1', 'SkillSet1', 'SkillSet2', 'Someother1', 'Someother2']},
     {_id : ObjectId(1249999494),tags : ['Location3', 'SkillSet1', 'SkillSet0', 'Someother4', 'Someother3']}]