【问题标题】:how to work with nested objects in mongodb with python如何使用 python 处理 mongodb 中的嵌套对象
【发布时间】:2021-04-24 15:02:14
【问题描述】:
{
    "_id": 4545,
    "username": "testt",
    "data": {
        "passwords": [
            {
                "dataID": "175",
                "username": "enc_data",
                "password": "enc_data",
                "any": "enc_data",
                "any1": "enc_data",
                "any3": "enc_data"
            }
        ],
        "fav_list": []
    }
};

所以我正在做一个项目,我会将用户加密的数据存储在一个名为“数据”的对象内的数组中,这样我就可以拥有一个组织良好的数据存储系统,但这里的问题我无法真正访问来自该嵌套对象的数据,我想使用“dataID”访问数据并使用每个数组对象的相同 ID 更新它......我正在使用 python btw。 感谢阅读。

【问题讨论】:

  • 不完全确定您的问题,但您是否尝试过使用例如 --- print(data[passwords][dataID]) 访问“DataID”
  • 是的,我需要访问密钥才能在数据库中插入数据,打印不是问题

标签: python arrays json mongodb


【解决方案1】:

Mongo 执行此操作的方式是使用arrayFilters,这让您可以使用查询来更新数组元素,如下所示:

db.collection.updateMany(
{},
{
  "$set": {
    "data.passwords.$[element].property_to_set": "new property value"
  }
},
{
  arrayFilters: [
    {
      "element.dataID": dataID
    }
  ],
})

Mongo Playground

还有pymongo:

collection.update_many(
{},
{
  "$set": {
    "data.passwords.$[element].property_to_set": "new property value"
  }
},
"array_filters"=[{"element.dataID": dataID}]
)

【讨论】:

  • 谢谢。那是我一直在寻找的东西,但你能帮我做点别的吗?我也需要使用 dataID 字段来查询数组对象中的所有数据。 $elemMatch 在嵌套字段上不起作用我在使用该代码时收到该错误 db.COLLECTION.find({_id:4545},{'data.passwords':{$elemMatch:{dataID:'175'}}})
  • 当然,如果您可以准确指定您想要的查询和输出结果是什么
  • 我想提供对象_id,然后前往数据对象和密码数组,因为每次我将插入密码数组时,它都会在其中包含唯一的数据ID,就像我在架构,所以我想使用 dataID 从密码数组中获取该对象。
  • 你不能像那样使用投影$elemMatch,阅读类似的问题here
  • 我尝试了这个解决方案,但没有按照我想要的方式工作,它只是获取所有内容。我只想使用该数据对象中的 dataID 键从数组中获取一个对象,就像我想要得到的那样dataID : '175' 这将为我获取数组中特定对象的用户名和密码等。这甚至可能吗?
【解决方案2】:

我删除了密码的 []

data1={
    "_id": 4545,
    "username": "testt",
    "data": {
        "passwords": {
            "dataID": "175",
            "username": "enc_data",
            "password": "enc_data",
            "any": "enc_data",
            "any1": "enc_data",
            "any3": "enc_data"
        },
        "fav_list": []
    }
}
res=data1['data']['passwords']['dataID']
print(res)
# 175

# modify existing data
res=data1['data']['passwords']['dataID']=200
print(res)
# 200

# insert new key
res=data1['data']['passwords']['new_var']=6
print(data1['data']['passwords'].keys())
# dict_keys(['dataID', 'username', 'password', 'any', 'any1', 'any3', 'new_var'])



【讨论】:

  • 好的,这对于访问 dataID 很有用,但是如果我想在该数据对象内的密码数组中插入数据怎么办
  • 实际上这是处理 python 文件中数据的好方法,但我也想更新 mongodb 中的数据,所以我使用了该代码并且它有效 db.COLLECTION.update({_id:4545 },{$push:{'data.passwords':{username : 'testnew'}}}) 这将插入一个新数据,但你知道我现在正尝试使用相同的机制获取数据
猜你喜欢
  • 1970-01-01
  • 2016-06-25
  • 2011-02-10
  • 1970-01-01
  • 2017-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-13
相关资源
最近更新 更多