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

Ars*_*hya 3 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
  }
Run Code Online (Sandbox Code Playgroud)

}

例如,如果在上述文件中我正在搜索xyz或"ab"或"xy"或"z"或"0",则应返回此文件.

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

请指教.

谢谢

Mal*_*och 9

您可以使用'$ where'来做到这一点

db.mycollection({$where:"JSON.stringify(this).indexOf('xyz')!=-1"})
Run Code Online (Sandbox Code Playgroud)

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

您可以让它遍历字段以创建一个大字符串,然后搜索它.

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


Cra*_*son 6

虽然上面马尔科姆的答案可行,但当您的收藏量变大或流量很高时,您会很快看到这种情况。这是因为 2 件事。首先,下降到 javascript 是一个大问题,其次,这将始终是全表扫描,因为 $where 不能使用索引。

MongoDB 2.6 引入了默认启用的文本索引(它在 2.4 中处于测试阶段)。有了它,您可以对文档中的所有字段进行全文索引。该文档给出了下面的例子中每个字段和名称索引“TextIndex”创建文本索引。

db.collection.ensureIndex(
    { "$**": "text" },
    { name: "TextIndex" }
)
Run Code Online (Sandbox Code Playgroud)

  • 文档链接:http://docs.mongodb.org/manual/reference/operator/query/text/ (2认同)
  • 链接文档是正确的方法,但如果其他人已经受够了并且只想要答案:`db.collection.find( { $text: { $search: "xyz" } } )` (2认同)