【问题标题】:Search full document in mongodb for a match在 mongodb 中搜索完整文档以查找匹配项
【发布时间】:2014-12-16 09:22:57
【问题描述】:

有没有办法将值与 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 查询也会有很大帮助。

请指教。

谢谢

【问题讨论】:

  • 如果它的任何字段或子文档的字段或数组中的子文档的字段包含给定的字符串,您需要匹配文档?
  • 可能这会更好地解释它..在客户端我们正在做一个角度 $.search 我想在后端实现同样的事情。返回在文档中不包括字段名称的任何位置具有该值的文档。
  • 好的,但这不是一个好的架构。更好地定义要搜索的字段。因此您可以使用该字段创建索引。如果没有索引,您的后端会在大量文档的情况下变得不负责任。

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


【解决方案1】:

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

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

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

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

这不是最优雅的方式,将涉及全表扫描。如果您查看各个字段会更快!

【讨论】:

  • 我已经实现了这个解决方案。它似乎工作正常,并且不会减慢应用程序的速度:) 谢谢!
  • 太棒了!我曾尝试使用文本索引一段时间,但发现此解决方案更加灵活且易于实施。
【解决方案2】:

虽然马尔科姆的上述回答会奏效,但当您的收藏量变大或流量很高时,您会很快看到这种下降。这是因为两件事。首先,降级到 javascript 很重要,其次,这将始终是全表扫描,因为 $where 不能使用索引。

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-22
  • 2016-10-13
  • 2017-09-12
  • 1970-01-01
  • 1970-01-01
  • 2013-03-28
相关资源
最近更新 更多