当您知道键但不知道值时,访问 mongo 对象中的值

Access value inside a mongo object, when you know the key but not the value

我试图在 mongo 对象中查找键的值。这是我在 mongo 中的文档的样子:

_id: 123456
▼ Item_Data: Object
   ▼ Payload: Object
      ▼ Items: Array
         ▸ 0: Object
         ▼ 1: Object
            key1: "string1"
            key2: "string2"
            key3: "string3"
         ▸ 2: Object
         ▼ 3: Object
            key1: "string4"
            key2: "string5"
            key3: "string6"

我想做什么:

  1. 我得到了一个键的值,例如,在这种情况下,我得到的是key1的字符串值“string1”
  2. 我在“Items”数组中搜索 key1 值为“string1”的对象。 (每个对象都有一个唯一的 key1 值)
  3. 我想找到我在上一步找到的同一个对象中的 key2 的值​​

所以我输入“string1”,在key1中找到具有“string1”值的对象,并在同一个对象中输出key2的值。在这种情况下,它会输出“string2”

我尝试了几种方法(所有方法都不起作用)直到找到这个,这似乎是最有希望的。

test = myCollection.find_one({ "_id": 123456, "Item_Data.payload.items.key1" : "string1" },
    { "Item_Data.payload.items.$": 1 })

如果我打印(测试),我得到:

{'_id': 123456, 'Item_Data': {'payload': {'items': [{'key1': 'string1', 'key2': 'string2', 'key3': 'string3'}]}}}  

我试图通过使用

来磨练相关数据
test = myCollection.find_one({ "_id": 123456, "Item_Data.payload.items.key1" : "string1" },
    { "Item_Data.payload.items.$": 1 })['Item_Data']['payload']['items']

但这只是打印

[{'key1': 'string1', 'key2': 'string2', 'key3': 'string3'}]

现在 ^^ 上面的这个东西是一个列表(我使用 type() 检查过),但是当我使用 len() 时,它 returns 1.

我也试过下面的代码:

var1 = json.dumps(test)
var2 = json.loads(var1)
print(type(test))
print(type(var1))
print(type(var2))
print(len(test))
print(len(var2))

哪个returns

<class 'list'>
<class 'str'>
<class 'list'>
1
1

基本上我将整个数据作为单个元素列表获取,因此不能做类似

的事情
print(var2['key2'])

获取key2的值。

我觉得我这样做完全错了

尝试以下方法

db.collection.aggregate([
  {
    $match: {
      "Item_Data.payload.items.key1": "string1"
    },
    
  },
  {
    $unwind: "$Item_Data.payload.items"
  },
  {
    $match: {
      "Item_Data.payload.items.key1": "string1"
    },
    
  },
  {
    $project: {
      _id: 1,
      key2: "$Item_Data.payload.items.key2"
    }
  }
])

输出

[
  {
    "_id": 123456,
    "key2": "string2"
  }
]

mongoplayground