pymongo如何定义附加值的键

时间:2018-07-15 03:17:19

标签: python pymongo

Mongodb集合如下:

 `col={"a":{"x":1,"y":2},"b":[{"w":5,"z":7},{"w":8,"z":5}]}`

在pymongo中有效:

 `col.find({"a.x":1}) or col.find({"b.w":5})`

现在,我想创建一个列表来附加键的值,例如“ a.x”或“ b.w”。我编写如下代码,但要注意。

 `data1=[]
 data2=[]
 finddata={}
 for data in col.find({}):
    finddata=dict(data)
    for key,value in finddata.items():
       if key == "a.x":      #if key=="a" will works
          data1.append(value)
       if key == "b.w":
          data2.append(value)`

有人可以帮助我吗?谢谢

2 个答案:

答案 0 :(得分:0)

使用Mongo聚合管道,可以投影您关心的字段,并将其替换为返回的根文档中的返回字段。 例如

pipeline = [
    {'$project': {'a.x':1, 'b.w': 1}},
    {'$replaceRoot': {'newRoot': {'a_x': '$a.x', 'b_w': '$b.w'}}}
] 

cur = db.keyes.aggregate(pipeline)
result = next(cur)

这样,您可以继续使用结果扩展相应的列表。

tolist = lambda x: x if isinstance(x, list) else [x]

data1.extend(tolist(result['a_x']))
data2.extend(tolist(result['b_w']))

答案 1 :(得分:0)

我终于找到了解决此问题的最佳方法,创建一个在数据库中找到的数据字典,然后将要选择的键定义为“ objkey”
def get_dict_in(Dict,objkey,default):
  for key,value in Dict.items():
    if key == objkey:
        return value
    else:
        if type(value) is dict:  # Note: import types
            val=get_dict_in(value,objkey,default)
            if default not in val:
                return val
return default

例如

dictA={"a":{"x":1,"y":2},"b":[{"w":5,"z":7},{"w":8,"z":5}]}
value=get_dict_in(dictA,'x',None)