【问题标题】:MongoDB wildcard in the key of a query查询键中的 MongoDB 通配符
【发布时间】:2011-09-05 00:15:50
【问题描述】:

是否可以在查询中使用通配符?例如,鉴于以下记录,我想做一个.find({'a.*': 4}) 此处已在 https://jira.mongodb.org/browse/SERVER-267 讨论过,但似乎尚未解决。

{
  'a': {
    'b': [1, 2],
    'c': [3, 4]
  }
}

【问题讨论】:

  • 我对 mongo 有同样的问题。我有很多这样的文档:{ one: { two: { more:data }, too: { more:data } } } 一旦你深入到文档树的一层,第二层的每个节点都是一个容器结构一致的文件。所以我希望能够像这样搜索:find({'one.*.some.data':5})

标签: mongodb mongodb-query wildcard


【解决方案1】:

正如所问,这是不可能的。您链接到的服务器问题仍在“我们不确定的问题”中

MongoDB 在使用数组方面有一些智能,我认为这是围绕此类功能的复杂性的一部分。

进行以下查询db.foo.find({ 'a.b' : 4 } )。此查询将匹配以下文档。

{ a: { b: 4 } }
{ a: [ { b: 4 } ] }

那么“通配符”在这里做什么? db.foo.find( { a.* : 4 } ) 是否匹配第一个文档?第二个呢?

此外,这在语义上意味着什么?正如您所描述的,查询实际上是“查找该文档中任何字段的值为 4 的文档”。这有点不寻常。

是否有您想要实现的特定语义?也许文档结构的改变会让你得到你想要的查询。

【讨论】:

  • 谢谢,这澄清了。更具体地说,我要做的是通配符只是分支中的特定节点,即a的任何适当的子字段。我不清楚 a.* 如何说“查找任何字段的位置”。不是'查找具有顶级字段'a'和匹配4'的子字段的文档吗?
  • 我认为这里的困惑在于“子字段”。当我写{a:{b:4,c:2}} 时,我是说值a 是一个JSON 对象。该 JSON 对象有两个键 bc。这些键的值分别是 4 和 2。当您请求 a.* 时,您实际上是在请求遍历该 JSON 对象中所有键的语法。您不是要求“循环遍历数组”,而是要求“循环遍历对象的属性”。这有点不寻常,这就是为什么我在这里要求一个特定的用例。
  • @gates:我有一个用例。 myDocInMongo = {'someUnknownKey':{propToCheck:true}, 'someKnownKey':true};现在,我想使用选择器 {someKnownKey:{$exists:true}} 找到此文档,但我还想确保没有其他键具有属性为 propToCheck 的对象。所以,像下面这样:{'*.propToCheck':{$exists:false}, {someKnownKey:{$exists:true}}}
猜你喜欢
  • 1970-01-01
  • 2015-04-05
  • 1970-01-01
  • 2016-04-06
  • 1970-01-01
  • 1970-01-01
  • 2020-10-13
  • 1970-01-01
相关资源
最近更新 更多