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

时间:2019-12-19 20:11:58

标签: javascript mongodb text-search

MongoDB collection_name的文档包含key: key_namevalue: "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: {...}
    }
);

2 个答案:

答案 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)

以下查询将找到数字为142的字符串。每个数字只出现一次,并以相同的顺序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' } }
    ]
} )

使用的正则表达式:

  • $not: /[0356789]/ }不包含任何数字0 3的匹配项 5 6 7 8 9
  • '^[^1]*1[^1]*$'1一个发生完全匹配;与...相同 42
  • '1[^4]*4[^2]*2'匹配三个数字142

参考文献:


在以下文件中:

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