在mongodb中搜索完整文档以进行匹配

时间:2014-10-21 08:11:18

标签: mongodb mongodb-query mongodb-.net-driver

有没有办法将值与mongodb集合中文档中的每个数组和子文档进行匹配并返回文档

{
  "_id" : "2000001956",
  "trimline1" : "abc",
  "trimline2" : "xyz",
  "subtitle"  : "www",
  "image" : {
    "large" : 0,
    "small" : 0,
    "tiled" : 0,
    "cropped" : false
  },     
  "Kytrr" : {
      "count" : 0,
      "assigned" : 0
  }

}

例如,如果在上述文件中我正在搜索xyz或" ab"或" xy"或" z"或" 0"这份文件应该退回。

我实际上必须使用C#驱动程序在后端实现这一点,但mongo查询也会有很大帮助。

请建议。

由于

2 个答案:

答案 0 :(得分:8)

您可以使用' $ where'

执行此操作
db.mycollection({$where:"JSON.stringify(this).indexOf('xyz')!=-1"})

我将整个记录转换为大字符串,然后搜索您的元素是否在结果字符串中。如果您的xyz在字段名中,可能无法工作!

你可以让它遍历字段来制作一个大字符串,然后搜索它。

这不是最优雅的方式,并且将涉及完整的表扫描。如果你仔细查看各个字段,它会更快!

答案 1 :(得分:4)

虽然Malcolm的上述答案可行,但当您的收藏量变大或流量很高时,您会很快看到这个问题。这是因为有两件事。首先,下载到javascript是一个大问题,其次,这将始终是一个全表扫描,因为$ where不能使用索引。

MongoDB 2.6引入了默认启用的文本索引(它在2.4版本中处于测试阶段)。有了它,您可以在文档中的所有字段上拥有全文索引。 documentation给出了以下示例,其中为每个字段创建了文本索引,并将索引命名为“TextIndex”。

db.collection.ensureIndex(
    { "$**": "text" },
    { name: "TextIndex" }
)