2015-04-15 67 views
1

我有两个问题。我发现了类似的东西,但我无法适应我的问题。在MongoDB数组中搜索数组时完全匹配

query = {'$and': [{'cpc.class': u'24'}, 
        {'cpc.section': u'A'}, 
        {'cpc.subclass': u'C'}]} 

集合:

 {"_id":1, 
     "cpc": 
     [{u'class': u'24', 
      u'section': u'A', 
      u'subclass': u'B'}, 
     {u'class': u'07', 
      u'section': u'C', 
      u'subclass': u'C'},]} 
     {"_id":2, 
     "cpc": 
     [{u'class': u'24', 
      u'section': u'A', 
      u'subclass': u'C'}, 
     {u'class': u'07', 
      u'section': u'K', 
      u'subclass': u'L'},]} 

在此查询中,两个文件将是牵强。

1)但我想只提取第二个文档(“_id”:2),因为它完全匹配查询。也就是说,第二个文档包含一个cpc元素,其类别等于24,其部分等于A,其子类等于C.

2)我想只抓取cpc的匹配元素(如果可能的话)?否则,我必须遍历每个检索文档的所有元素;如果我遍历并试图找出哪些元素完全匹配,那么我的第一个问题就没有意义了。

谢谢!

回答

1

1)你要找哪个比较子文档作为一个整体更简洁然后单独的子元素查询$elemMatch operator(你不需要在查询中$and的方式):

query = { 'cpc' : { 
       '$elemMatch': { 'class': u'24', 
           'section': u'A', 
           'subclass': u'C' } } }; 

2)可以使用的投影来完成:

db.find(query, { "cpc.$" : 1 }) 

$ projection operator documentation包含几乎这种使用情况下,例如,