MongoDB检索字段的一部分

时间:2012-11-05 15:40:11

标签: mongodb

我有一个类似于以下的表

 field1
============
sssss(x)sdfs
ddd(d)fsdfsd
adf(d)dfssdf
sdf(x)sdfsdf

我想在field1中的括号中回溯所有不同的文本,如何获得以下输出?

subStirng
===========
x
d

2 个答案:

答案 0 :(得分:0)

一个简单的解决方案是运行map-reduce作业来创建像

这样的集合
sssss x sdfs
ddd d fsdfsd
adf d dfssdf
sdf x sdfsdf

此时可以运行distinct或者您可以在m-r中编写reduce函数以获得以下内容

x
d

答案 1 :(得分:0)

使用正则表达式:

> db.test.insert({"field1":"sssss(x)sdfs"})
> db.test.insert({"field1":"ddd(d)fsdfsd"})

> db.test.find().forEach(function(foo){print(foo.field1.match(/\w*\((\w)\)\w*/)[1])})
x
d

我发现上面的方法没有显示distinct结果。

或尝试map / reduce功能?

m = function(){emit(this.field1.match(/\w*\((\w)\)\w*/)[1], 1)}
r = function(key, values){ return 1;}
db.test.mapReduce(m, r, {out:{inline:1}})

{
    "results" : [
            {
                    "_id" : "d",
                    "value" : 1
            },
            {
                    "_id" : "x",
                    "value" : 1
            }
    ],
    "timeMillis" : 399,
    "counts" : {
            "input" : 30003,
            "emit" : 30003,
            "reduce" : 302,
            "output" : 2
    },
    "ok" : 1,
}

或者......也许你可以在插入之前找到子串并将其存储在另一个字段中。我认为这种方式会更快。