我有一个MongoDB 3.2服务器。 我的收藏包含以下文件:

{
    "name": "string",
    "explicitMods": [
        "+48 to Blah",
        "-13% to Blah",
        "12 to 18 to Blah"
    ]
}

如果我写这个:

myCollection.find({“explicitMods”:/ bad string /})

正如预期的那样,我得到零结果。

但是,如果我这样写:

myCollection.find({“explicitMods”:/ \\ d + to \\ d + /})

我收集了所有文件。 这是意料之外的,因为我实际上想要包含12 to 18个子字符串的文档。 如果我将正则表达式更改为/\\d+ to \\d+z/它正确匹配任何内容。

#1楼 票数:1

您正在“正确”发出的查询将返回与您要求的条件实际匹配的文档 这就是您正在测试的属性中的“至少一个”数组元素实际上与查询中的条件匹配。

由此我们可以推测出两种可能的结果:

  1. 您的意图是仅返回所有数组条目满足条件的文档。

  2. 您的意图是“过滤”文档中“数组”中的条目,只返回满足条件的结果。

从中可以看出各种方法。 首先,实际上没有MongoDB的这样的查询运算符要求“全部”数组元素必须通过“常规查询”由给定条件满足。 因此,您需要以不同的形式应用逻辑。

一种这样的选择是以检查数组内容的方式使用$where的JavaScript评估。 在这里你可以应用Array.every()来测试你的条件,当然除了常规的查询过滤器,因为它实际上正在做一些有用的工作。

鉴于以下源文档:

/* 1 */
{
    "_id" : ObjectId("5993a35be38f41729f1d6501"),
    "name" : "string",
    "explicitMods" : [ 
        "+48 to Blah", 
        "-13% to Blah", 
        "12 to 18 to Blah"
    ]
}

/* 2 */
{
    "_id" : ObjectId("5993a35be38f41729f1d6502"),
    "name" : "string",
    "explicitMods" : [ 
        "12 to 18 to Blah"
    ]
}

如果您的目的只是返回与“所有”数组元素匹配的“文档”,则发出以下语句:

db.myCollection.find({ 
  "explicitMods": /\d+ to \d+/,
  "$where": function() { return this.explicitMods.every(e => /\d+ to \d+/.test(e)) }
  }
})

仅返回匹配的文档:

{
    "_id" : ObjectId("5993a35be38f41729f1d6502"),
    "name" : "string",
    "explicitMods" : [ 
        "12 to 18 to Blah"
    ]
}

在使用$where的备用情况下,MongoDB的聚合框架允许使用“本机编码运算符”的表达式,这些运算符通常比JavaScript解释表达式应用更快。 然而,实际上没有这样的“逻辑运算符”等价(参见SERVER-11947$regex适用于聚合操作,例如$redact

因此,这里可用的唯一方法是使用$unwind来使用$match与常规查询条件“之后”使用$unwind对数组元素进行非规范化:

db.myCollection.aggregate([
  // Match "possible" documents
  { "$match": { "explicitMods": /\d+ to \d+/ } },

  // unwind to denormalize
  { "$unwind": "$explicitMods" },

  // Match on the "array" items now as documents
  { "$match": { "explicitMods": /\d+ to \d+/ } },

  // Optionally "re-group" back to documents with only matching array items
  { "$group": {
    "_id": "$_id",
    "name": { "$first": "$name" },
    "explicitMods": { "$push": "$explicitMods" }
  }}
])

那个将返回“两个”文档,但只返回具有匹配数组项的文档:

/* 1 */
{
    "_id" : ObjectId("5993a35be38f41729f1d6501"),
    "name" : "string",
    "explicitMods" : [ 
        "12 to 18 to Blah"
    ]
}

/* 2 */
{
    "_id" : ObjectId("5993a35be38f41729f1d6502"),
    "name" : "string",
    "explicitMods" : [ 
        "12 to 18 to Blah"
    ]
}

当然,您可以对该主题应用“变体”并针对过滤条件“测试数组的长度”,以便决定返回哪个文档:

db.myCollection.aggregate([
  { "$match": { "explicitMods": /\d+ to \d+/ } },
  { "$addFields": { "origSize": { "$size": "$explicitMods" } } },
  { "$unwind": "$explicitMods" },
  { "$match": { "explicitMods": /\d+ to \d+/ } },
  { "$group": {
    "_id": "$_id",
    "name": { "$first": "$name" },
    "origSize": { "$first": "$origSize" },
    "explicitMods": { "$push": "$explicitMods" },
  }},
  { "$redact": {
    "$cond": {
      "if": { 
        "$eq": [
          { "$size": "$explicitMods" },
          "$origSize"
        ]
      },
      "then": "$$KEEP",
      "else": "$$PRUNE"
    }
  }}
])

但是虽然它与使用“原生运算符”的$where原始选项做同样的事情,但是诸如$unwind之类的操作的一般成本使得它的实用性有问题,因此可能花费相当多的时间和资源来产生结果。原始查询。

  ask by Jesse Hallam translate from so

未解决问题?本站智能推荐:

1回复

查询猫鼬用$ regex不返回结果

尝试使用正则表达式构建猫鼬查询,但由于某种原因,它始终返回零结果。 我有一个名为Place的模型,其值是wind_direction。 wind_direction是一个字符串,看起来像这样: 我通过一种形式(在这种情况下为“ W,WNW,NW”)获取值,并尝试构建这样的正则表达
1回复

MongoDB Like查询(起始字母或单词查找查询)

我有一个MongoDB查询,如下所述: 该查询为我提供了包含该查询的所有结果。例如,我的查询为test,则输出显示所有包含'test'的结果。 如果我想要仅以字母“ t”或单词“ test”开头的结果,该怎么办?
1回复

如何查询mongo db以返回搜索词中所有键的组合?

在mongo db中是标签。 我试图从搜索词的开头拉出所有匹配的标签。 是否可以在mongo查询中实现以下功能? Mongo数据: [ { tag: '123' }, { tag: '1234' }, { tag: '123456' }, { tag: '987' }
1回复

如何在MongoDB中使用regexp查找单词中的所有值?

假设我在MongoDB文档中有以下字符串: 我需要通过输入以下搜索请求,使用regexp构建mongodb查询来查找此文档: space string 看起来像LIKE运算符。 我知道最新的MongoDB 3具有全文搜索功能,但是由于当前版本过旧,我需要使用regexp 。
1回复

在聚合查询中使用$ match

我的Mongodb中有这些值: 我试图得到这个结果: 这是我正在使用的查询: 另外,尝试了这个: 但我一直得到这个结果: 即使我将FAST_1更改为FAST_2,我也会得到相同的结果。 任何帮助表示赞赏。 谢谢
1回复

Mongo DB查询与

我将数据存储在mongo数据库中,并且我的集合有两个字段,即created_at , text ,我想提取一个文本字段中包含诸如bank , chile和fin类的单词,并且created_at值为1 jan 15. 。 我是mongodb的新手,当我尝试使用以下查询时,它给出的错误为“ 意外
2回复

MongoDB包含查询的不同查询

我有一个mongo集合用户 ,其中包含以下数据: 当我使用以下查询搜索具有C ++技能的所有用户时,我得到的是预期的正确结果 但是,当我使用相同条件从用户搜索所有唯一名称时,我没有得到任何期望的结果 谁能帮我解决我做错的事情?
1回复

使用正则表达式创建语态查询

我有以下课程: 现在我想查询Channel内的topic 。 如果知道channelType ,我们可以很容易地查询如下: 但是,如果我只想查询给定topic ( channelType可以是任何东西)怎么办? 我们如何为此创建查询? 一种选择是使用or如下: