Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在MongoDB中搜索特定数字的字符串?_Javascript_Mongodb_Text Search - Fatal编程技术网

Javascript 如何在MongoDB中搜索特定数字的字符串?

Javascript 如何在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

MongoDB
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" }