Javascript 如何在MongoDB中搜索特定数字的字符串?
MongoDBJavascript 如何在MongoDB中搜索特定数字的字符串?,javascript,mongodb,text-search,Javascript,Mongodb,Text Search,MongoDBcollection\u name有一些带有key:key\u name和值:“1 ff 42”的文档 如果我只知道值中的所有数字等于142,我如何才能找到此文档?我可以从字符串中提取所有数字,并将其转换为整数 var字符串,带有数字=“1 ff 42”; 数字\u数组=字符串\u与\u数字匹配(/[0-9]+//g); //142乘整数 结果=parseInt(number_array.join(“”)); 但是,我如何从集合中提取所有文档,其中值中的所有数字都等于142 d
collection\u name
有一些带有key:key\u name
和值:“1 ff 42”
的文档
如果我只知道值中的所有数字等于142,我如何才能找到此文档?我可以从字符串中提取所有数字,并将其转换为整数
var字符串,带有数字=“1 ff 42”;
数字\u数组=字符串\u与\u数字匹配(/[0-9]+//g);
//142乘整数
结果=parseInt(number_array.join(“”));
但是,我如何从集合中提取所有文档,其中值中的所有数字都等于142
db.collection\u name.find(
{
密钥名称:{…}
}
);
这有点棘手,但您可以通过以下聚合实现您的案例:
db.collection\u name.aggregate([
{
“$addFields”:{
“结果”:{
“$regexFindAll”:{
“输入”:“$value”,
“正则表达式”:“[0-9]+”
}
}
}
},
{
“$project”:{
“编号”:{
“$convert”:{
“输入”:{
“$reduce”:{
“输入”:“$results”,
“initialValue”:“,
“在”:{
“$concat”:[“$$value”,“$$this.match”]
}
}
},
“to”:“int”,
“onError”:“没有匹配的数字”
}
}
}
},
{
“$match”:{
“数字”:142
}
}
])
数据:
在第一阶段之后,$addFileds
将有如下内容:
然后在第二阶段$project
之后:
最后,使用$match
您将获得预期结果:
以下查询将查找带有数字
1
、4
和2
的字符串。每个数字只出现一次,顺序相同1
、4
和2
db.test.find( { $and: [
{ str: { $not: /[0356789]/ } },
{ str: { $regex: '^[^1]*1[^1]*$' } },
{ str: { $regex: '^[^4]*4[^4]*$' } },
{ str: { $regex: '^[^2]*2[^2]*$' } },
{ str: { $regex: '1[^4]*4[^2]*2' } }
]
} )
使用的正则表达式:
匹配,但没有任何这些数字$not:/[0356789]/}
0
3
5
6
7
8
9
与“^[^1]*1[^1]*$”
的一次发生完全匹配;同1
和4
2
匹配三个数字'1[^4]*4[^2]*2'
、1
和4
的顺序
2
在下列文件中:
{ "str" : "1 ff 42" }
{ "str" : "0 ff 42" }
{ "str" : "142" }
{ "str" : "14 xx2" }
{ "str" : "42" }
{ "str" : "90 a1 b2 4cc" }
{ "str" : "" }
{ "str" : "421" }
{ "str" : "01xf49W2q" }
{ "str" : "1 ff 422" }
{ "str" : "13 8ff 8x9" }
{ "str" : "x4 a1wx12" }
只有这三个匹配:
{ "str" : "1 ff 42" }
{ "str" : "142" }
{ "str" : "14 xx2" }
现在,您的文档中没有任何包含
142的内容,因此该文档无法找到包含142的内容。我的观点是,您失去了这些新值的上下文(在组合它们并将它们转换为整数后,如上所示)/\d+/
给出了以下错误:无法解析查询内容:无效字符“/”正在寻找值的开头
@Valijon这很奇怪,我已经在v4.2.0上测试了聚合,没有出现错误。请尝试:
{ "_id" : ObjectId("5dfbf14671f3d8949c44881c"), "number" : 142 }
{ "_id" : ObjectId("5dfbf14671f3d8949c44881d"), "number" : 142 }
db.test.find( { $and: [
{ str: { $not: /[0356789]/ } },
{ str: { $regex: '^[^1]*1[^1]*$' } },
{ str: { $regex: '^[^4]*4[^4]*$' } },
{ str: { $regex: '^[^2]*2[^2]*$' } },
{ str: { $regex: '1[^4]*4[^2]*2' } }
]
} )
{ "str" : "1 ff 42" }
{ "str" : "0 ff 42" }
{ "str" : "142" }
{ "str" : "14 xx2" }
{ "str" : "42" }
{ "str" : "90 a1 b2 4cc" }
{ "str" : "" }
{ "str" : "421" }
{ "str" : "01xf49W2q" }
{ "str" : "1 ff 422" }
{ "str" : "13 8ff 8x9" }
{ "str" : "x4 a1wx12" }
{ "str" : "1 ff 42" }
{ "str" : "142" }
{ "str" : "14 xx2" }