mongoose 在MongoDB中查找数组字段中的一个或多个元素与其他数组中的元素匹配的文档

cwdobuhd  于 9个月前  发布在  Go
关注(0)|答案(2)|浏览(138)

到目前为止我得到的查询:

const cities = await City.find({ names :  { $in: citiesArray }})

字符串
字段names是由逗号(e.g "A, B, C, D, E...")分隔的String
字段citiesArray是数组(e.g. ["A", "B", "C", "D", "E", ...])
我怎样才能改变这段代码,让我们说,返回所有包含names字段'A'中第一个元素的文档。当然,如果数组中的任何元素与字符串字段名称中的任何元素匹配,这将是有用的,但现在,匹配第一个元素就足够了。

kt06eoxx

kt06eoxx1#

您可以Maparray并从其中的每个值生成new Regex

const citiesArray = ["A", "B", "C", "D", "E", ...];

const mapToRegex = array => array.map(val => new RegExp(val, 'i'));
const cities = await City.find({ names: { $in: mapToRegex(citiciesArray) } });

字符串
或者你可以使用管道分隔的|正则表达式模式:

const citiesArray = ["A", "B", "C", "D", "E", ...];
const cities = db.city.find({ names: { $regex: match.join("|"), $options: 'i' }});


我在这里创建了一个演示,其中包含更多示例,包括两种方法的结果,以便更好地解释它:Demo Link
另外,这里是文档:MongoDB Regex

iaqfqrcu

iaqfqrcu2#

我能找到的唯一解决办法是:

const city = await City.findById({_id: req.params.id})
const names = city.cities.split(",")
const first = names[0]
const cities = await City.find({ names: new RegExp(first, 'i') })

字符串
如果我必须只匹配第一个数组中的第一个值(来自field cities),它会解决这个问题。但如果稍后我试图扩展以匹配字符串的第一个字段(以逗号分隔)和itens数组中的所有字段,这不是一个好的解决方案。

相关问题