2011-05-30 52 views
28

是否有可能在查询中通配符?例如,考虑下面的记录,我喜欢做.find({'a.*': 4}) 这是这里https://jira.mongodb.org/browse/SERVER-267讨论,但它看起来像它没有得到解决。MongoDB通配符在查询中的键

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

我与mongo有同样的问题。我有很多这样的文档:{one:{two:{more:data},{more:data}}} 一旦你进入文档树一级,第二级的每个节点都是一个容器对于结构一致的文档。所以我想能够像这样搜索:find({'one。*。some.data':5}) – rev 2012-01-05 20:41:25

回答

10

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

MongoDB中具有一定的智能周边数组的使用,我认为这是周围这样的功能复杂的一部分。

以下面的查询db.foo.find({ 'a.b' : 4 })。该查询将匹配以下文档。

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

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

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

是否有一个特定的语义,你想达到什么目的?也许文档结构的变化会让你得到你想要的查询。

+0

谢谢,澄清。更具体地说,我期望做的是通配符,只是分支中的特定节点,即a的任何合适的子字段。我不清楚如何。*说'找到任何领域'。是不是'找到具有与4'匹配的子字段的顶级字段'a'的文档? – Brad 2011-06-01 05:48:23

+0

我认为这里的困惑是围绕“子领域”。当我写'{a:{b:4,c:2}}'时,我的意思是'a'的值是一个JSON对象。那个JSON对象有两个键'b'和'c'。这些密钥的值分别是4和2。当你要求'a。*'时,你实际上要求的语法循环遍历该JSON对象中的所有键。你不要求*“循环访问一个数组”*,你要求*“遍历一个对象的属性”*。这有点不寻常,这就是为什么我在这里要求一个特定的用例。 – 2011-06-01 17:15:19

+2

@gates:我有一个用例。 myDocInMongo = {'someUnknownKey':{propToCheck:true},'someKnownKey':true}; 现在,我想使用选择器{someKnownKey:{$ exists:true}}来查找此文档,但我也想确保其他任何键都不具有属性propToCheck的对象。因此,如下所示: {'* .propToCheck':{$ exists:false},{someKnownKey:{$ exists:true}}} – doubletap 2012-05-03 17:57:25