0

我是 MongoDB 世界的新手,有一些基本问题。我想知道是否可以在 MongoDB 中搜索字符串。例如这里有一条记录:

db.test.insert({ s_id:0, c_id:1, json:"{result:[104192,42068],id:1}" })

当我在 s_id 上进行查找时,它工作正常:

db.test.findOne({s_id:0}) { "_id" : ObjectId("511d1675d3c6fdeb779c8ea8"), "s_id" : 0, "c_id" : 1, "json" : "{result:[104192,42068],编号:1}" }

但是,如果我在 json 上进行查找:“结果”它不起作用

db.test.findOne({json : "result"}) null

同时我确实确保了 json 上的索引

db.test.ensureIndex({json:1})

是否可以在其中对此类字符串进行搜索,或者我们是否需要在此之上创建 SOLR 或 Elastic Search?

任何指针都非常感谢

谢谢马斯蒂

4

2 回答 2

0

因此,您的 json 键的值是序列化的 json。如果您正在搜索具有包含单词“结果”的 json 值的文档,则可以使用 $regex 运算符。您没有说明您拥有多少条记录或您期望的性能,因此 Solr / Lucene 可能是矫枉过正。您还可以查看最新 MongoDB 版本中的新自由文本搜索功能。

尝试:

db.test.find({json:/result:/i});

在我的机器上:

> db.test.insert({ s_id:0, c_id:1, json:"{result:[104192,42068],id:1}" })
> db.test.find({json:/result:/i});
{ "_id" : ObjectId("511d21fe0ff85d1b95a5f8b1"), "s_id" : 0, "c_id" : 1, "json" : "{result:[104192,42068],id:1}" }

顺便说一句,来自 MongoDB 手册:

“$regex 只有在正则表达式在字符串的开头(即 ^)有一个锚点并且是区分大小写的匹配时才能有效地使用索引”

所以你实际上可能想要

> db.test.ensureIndex({json:1})
> db.test.find({json:{ $regex:'^{result:'}}).explain();
{
    "cursor" : "BtreeCursor json_1 multi",
    "isMultiKey" : false,
    "n" : 1,
    "nscannedObjects" : 1,
    "nscanned" : 1,
    "nscannedObjectsAllPlans" : 1,
    "nscannedAllPlans" : 1,
    "scanAndOrder" : false,
    "indexOnly" : false,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "millis" : 0,
    "indexBounds" : {
        "json" : [
            [
                "",
                {

                }
            ],
            [
                /^{result:/,
                /^{result:/
            ]
        ]
    },
    "server" : "Micks-MacBook-Pro-3.local:27017"
}
于 2013-02-14T17:41:27.013 回答
0

此链接很好地涵盖了 Mongo 中的读取操作基础知识:http: //docs.mongodb.org/manual/applications/read/

编辑:不建议在大型数据库中使用更复杂的查询在 Mongo 中进行搜索。如果您经常想要这样做,请考虑使用 solr 之类的索引。Mongo 最好使用 id 进行搜索。

于 2013-02-14T17:23:23.783 回答