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

问题描述 投票:1回答:2

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: {...}
    }
);
javascript mongodb text-search
2个回答
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 }

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]/ }匹配,没有这些数字0356789
  • '^[^1]*1[^1]*$'完全匹配1one个出现;与...相同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" }
© www.soinside.com 2019 - 2024. All rights reserved.