我有两个问题。我找到了类似的东西,但我无法适应我的问题。
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的匹配元素?否则我必须遍历每个检索到的文件的所有元素;如果我遍历并试图找出哪个元素完全匹配,那么我的第一个问题将毫无意义。
谢谢!
答案 0 :(得分: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几乎包含了这个用例作为示例。