2013-02-14 82 views
0

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

db.test.insert({S_ID:0,C_ID:1,JSON: “{结果:[104192,42068],ID:1}”})

当我做一个找到S_ID它工作正常:

db.test.findOne({S_ID:0}) { “_id”:物件( “511d1675d3c6fdeb779c8ea8”), “S_ID” :0, “c_id”:1, “json”:“{result:[104192,42068],id:1}” }

但是,如果我做一个JSON发现: “结果” 这是行不通的

db.test.findOne({JSON: “结果”}) 空

同时我也保证指数的JSON

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

是否可以在这样的字符串中搜索或者我们是否需要在此之上创建SOLR或弹性搜索?

任何指针的高度赞赏

感谢 Masti

回答

0

因此,您的json密钥的值是序列化json。如果您正在搜索包含单词'result'的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的手册:

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

所以,你实际上可能要

> 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" 
} 
+0

注意,除了这个还有新加入的文本搜索功能。这是一个博客的链接发布这个新功能后:http://blog.mongodb.org/post/40513621310/mongodb-text-search-experimental-feature-in-mongodb – ACE 2013-02-14 18:34:30

+0

因此,我的意见在我的回答的第一段:) – 2013-02-14 21:25:35

0

此链接涵盖读取操作基础知识蒙戈相当好:http://docs.mongodb.org/manual/applications/read/

编辑:使用更复杂的查询搜索在蒙戈没有在大推荐数据库。如果你经常想这样做,可以考虑一个像索尔这样的索引。 Mongo最好用id搜索。