MongoDB collection_name
的文档包含key: key_name
和value: "1 ff 42"
。
如果我仅知道该如何找到该文档,值中的所有数字等于142?我可以从字符串中提取所有数字,然后将其“转换”为Integer。
var string_with_numbers = "1 ff 42";
number_array = string_with_numbers.match(/[0-9]+/g);
// 142 by Integer
result = parseInt(number_array.join(''));
但是,如何从值中所有数字等于142的集合中提取所有文档?
db.collection_name.find(
{
key_name: {...}
}
);
答案 0 :(得分:1)
这有点棘手,但是您可以通过这种聚合来实现自己的目标:
db.collection_name.aggregate([
{
"$addFields": {
"results": {
"$regexFindAll": {
"input": "$value",
"regex": "[0-9]+"
}
}
}
},
{
"$project": {
"number": {
"$convert": {
"input": {
"$reduce": {
"input": "$results",
"initialValue": "",
"in": {
"$concat": ["$$value", "$$this.match"]
}
}
},
"to": "int",
"onError": "no digit matched"
}
}
}
},
{
"$match": {
"number": 142
}
}
])
数据:
> db.collection_name.find()
{ "_id" : ObjectId("5dfbf14671f3d8949c44881c"), "value" : "1rt 42" }
{ "_id" : ObjectId("5dfbf14671f3d8949c44881d"), "value" : "1 4sd 2" }
{ "_id" : ObjectId("5dfbf14671f3d8949c44881e"), "value" : "14 e 6" }
{ "_id" : ObjectId("5dfbf47c71f3d8949c44881f"), "value" : "test" }
第一阶段
$addFileds
之后,将会出现以下内容:
{
"_id" : ObjectId("5dfbf14671f3d8949c44881c"),
"value" : "1rt 42",
"results" : [
{
"match" : "1",
"idx" : 0,
"captures" : [ ]
},
{
"match" : "42",
"idx" : 4,
"captures" : [ ]
}
]
}
.
.
{
"_id" : ObjectId("5dfbf47c71f3d8949c44881f"),
"value" : "test",
"results" : [ ]
}
第二阶段
$project
之后:
{ "_id" : ObjectId("5dfbf14671f3d8949c44881c"), "number" : 142 }
{ "_id" : ObjectId("5dfbf14671f3d8949c44881d"), "number" : 142 }
{ "_id" : ObjectId("5dfbf14671f3d8949c44881e"), "number" : 146 }
{ "_id" : ObjectId("5dfbf47c71f3d8949c44881f"), "number" : "no digit matched" }
最后使用
$match
,您将获得预期的结果:
{ "_id" : ObjectId("5dfbf14671f3d8949c44881c"), "number" : 142 }
{ "_id" : ObjectId("5dfbf14671f3d8949c44881d"), "number" : 142 }
答案 1 :(得分:0)
以下查询将找到数字为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" }