Mongoose Найти все документы, соответствующие подстроке входных данных - PullRequest
0 голосов
/ 22 декабря 2018

Предположим, у вас есть этот массив 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 }))


Вот пример, чтобы сделать его более понятным:

У меня есть этот fileName: filename1_c4d.rar.Основываясь на этом имени, запрос должен быть в состоянии получить Tag с именем cinema4d, потому что его псевдонимы включают подстроку fileName filename1_c4d.rar

Таким образом, эти fileNames должны получить следующее Tags:

  • filename1_c4d.rarcinema4d

  • text122_octane.c4dcinema4d, octane

  • texture1.pngtextures

  • texture2.pngtextures


Итак, в итоге результат запроса должен быть таким: Tags (без дублирования):

cinema4d, octane, textures


PS: объяснить, что это такоеfor:

Пользователь может загрузить, например, файл .rar, и я хочу автоматически назначать теги на основе имен файлов, которые находятся внутри файла .rar.


НадеюсьПонятно, какова моя цель.Пожалуйста, дайте мне знать, если есть что-то, чего вы не понимаете.

1 Ответ

0 голосов
/ 22 декабря 2018

вам нужно использовать агрегационный конвейер для сравнения псевдонима с подстрокой входного массива

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" ] }
>
...