猫鼬查找匹配输入子字符串的所有文档

时间:2018-12-21 21:20:24

标签: node.js mongodb mongoose mongodb-query tagging

假设您有以下fileNames数组:

[
    'filename1_c4d.rar',
    'text122_octane.c4d',
    'texture1.png',
    'texture2.png',
]

在我的数据库中,我有Tags的集合:

[
    {
        _id: 'id1',
        name: 'cinema4d',
        aliases: ['.c4d', 'c4d', 'cinema4d'],
    },
    {
        _id: 'id2',
        name: 'octane',
        aliases: ['octane'],
    },
    {
        _id: 'id3',
        name: 'textures',
        aliases: ['texture', 'textures'],
    },
    // ...
]

我的目标是在Tags的帮助下在fileNames中获取所有具有aliases子字符串的mongoose。 (Tags.find({ someFancyQuery: fileNames })


下面是一个使其更易于理解的示例:

我有这个文件名:filename1_c4d.rar。基于该名称,查询应该能够获取名称为Tag的{​​{1}},因为它的别名包括文件名cinema4d filename1_的子字符串 c4d

因此,这些文件名应获取以下.rar

  • Tags filename1_ c4d.rar

  • cinema4d text122_ octane . c4d

  • cinema4d, octane texture1.png

  • textures texture2.png


因此,最后查询的结果应该是那些textures(无重复):

Tags


P.S .:解释这是做什么的:

用户可以上传例如一个cinema4d, octane, textures文件,我想根据.rar文件中的文件名自动分配标签。


我希望我的目标很明确。请让我知道您是否不了解某些内容。

1 个答案:

答案 0 :(得分:1)

您需要使用聚合管道来比较别名是输入数组的子字符串

db.t5.aggregate([
        {$addFields :{tags: tags, matches : {$map:{input: "$aliases", as: "a", in: {$map : {input: tags, as: "i", in: {$gte:[{$indexOfCP:["$$i", "$$a"]},0]}}}}}}}, 
        {$addFields: {matchez :{$reduce : {input : "$matches", initialValue : [], in: { $concatArrays: [ "$$value", "$$this" ] }}}}}, 
        {$match: {"matchez" : {$in : [true]}}}, 
        {$group : {_id: null, names : {$addToSet : "$name"}}}
    ])

结果

{ "_id" : null, "names" : [ "octane", "textures", "cinema4d" ] }

样品采集

> db.t5.find()
{ "_id" : "id1", "name" : "cinema4d", "aliases" : [ ".c4d", "c4d", "cinema4d" ] }
{ "_id" : "id2", "name" : "octane", "aliases" : [ "octane" ] }
{ "_id" : "id3", "name" : "textures", "aliases" : [ "texture", "textures" ] }
{ "_id" : "id4" }
{ "_id" : "id5" }
{ "_id" : "id6" }

输入标签

> tags
[
        "filename1_c4d.rar",
        "text122_octane.c4d",
        "texture1.png",
        "texture2.png"
]

结果

> db.t5.aggregate([{$addFields :{tags: tags, matches : {$map:{input: "$aliases", as: "a", in: {$map : {input: tags, as: "i", in: {$gte:[{$indexOfCP:["$$i", "$$a"]},0]}}}}}}}, {$addFields: {matchez :{$reduce : {input : "$matches", initialValue : [], in: { $concatArrays: [ "$$value", "$$this" ] }}}}}, {$match: {"matchez" : {$in : [true]}}}, {$group : {_id: null, names : {$addToSet : "$name"}}}])
{ "_id" : null, "names" : [ "octane", "textures", "cinema4d" ] }
>