如何访问按键名存储键值对的MongoDB数组

2024-06-26 14:14:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在与pymongo合作,在编写聚合查询之后

db.collection.aggregate([{'$project': {'Id': '$ResultData.Id','data' : '$Results.Data'}}])

我收到了目标:

{'data': [{'key': 'valid', 'value': 'true'},
      {'key': 'number', 'value': '543543'},
      {'key': 'name', 'value': 'Saturdays cx'},
      {'key': 'message', 'value': 'it is valid.'},
      {'key': 'city', 'value': 'London'},
      {'key': 'street', 'value': 'Bigeye'},
      {'key': 'pc', 'value': '3566'}],

是否有一种方法可以通过键名访问值?像那样{}我将得到伦敦。我希望在MongoDB聚合查询级别上执行此操作,因此这意味着我希望以以下方式编写查询:

db.collection.aggregate([{'$project': 
    {'Id': '$ResultData.Id',
    'data' : '$Results.Data',
    'city' : $Results.Data.city',
    'name' : $Results.Data.name',
    'street' : $Results.Data.street',
    'pc' : $Results.Data.pc',
            }}])

并接收所提供密钥的所有值


Tags: keynameprojectidstreetcitydbdata
2条回答

在以下来自mongoshell的查询中使用$elemMatch投影运算符:

db.collection.find(
  { _id: <some_value> }, 
  { _id: 0, data: { $elemMatch: { key: "city" } } } 
)

输出:

{ "data" : [ { "key" : "city", "value" : "London" } ] }


使用PyMongo(获得相同的输出):

collection.find_one( 
  { '_id': <some_value> }, 
  { '_id': 0, 'data': { '$elemMatch': { 'key': 'city' } } } 
)

使用PyMongo聚合方法(得到相同的结果):

pipeline = [
  {
      '$project': {
         '_id': 0,
          'data': {
              '$filter': {
                  'input': '$data', 'as': 'dat',
                  'cond': { '$eq': [ '$$dat.key', INPUT_KEY ] }
              }
          }
      }
  }
]

INPUT_KEY = 'city'

pprint.pprint(list(collection.aggregate(pipeline)))

将接收到的对象命名为“result”,如果result['data']始终是一个包含两个键(keyvalue)的字典列表,则可以使用key作为键,使用value作为值,将整个列表转换为字典。鉴于此语句有些混乱,下面是代码:

data = {pair['key']: pair['value'] for pair in result['data']}

从这里,data['city']将给你'London'data['street']'Bigeye'等等。显然,这假定result['data']中的key值之间没有冲突。请注意,此字典(就像原始的result['data'])只包含字符串,因此不要期望data['number']是整数

另一种方法是动态创建一个对象,将每个键值对作为属性保存,允许您使用以下语法:data.citydata.street。。。但这需要更复杂的代码,并且是一种不太常见和稳定的方法

相关问题 更多 >