假设您有一个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
中有myaliases
子字符串的所有mongoose
。(Tags.find({ someFancyQuery: fileNames })
)下面是一个例子,可以更好地理解:
我有这个文件名:
filename1_c4d.rar
。基于此名称,查询应该能够获取名为Tag
的cinema4d
,因为它的别名包含文件名filename1_
c4d
.rar
的子字符串。因此,这些文件名应该获取以下
Tags
:filename1_
c4d
.rar
cinema4d
text122_
octane
.
c4d
cinema4d, octane
texture
1.png
textures
texture
2.png
textures
因此,最终查询的结果应该是那些
Tags
(没有重复的):cinema4d, octane, textures
备注:解释一下这是为了什么:
用户可以上传一个
.rar
文件,我想根据.rar
文件中的文件名自动分配标签。我希望我的目标很明确。如果你有什么不明白的地方,请告诉我。
最佳答案
需要使用聚合管道来比较alias is input array的子字符串
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" ] }
>
关于node.js - Mongoose查找匹配输入子串的所有文档,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53890895/