当您知道键但不知道值时,访问 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"
我想做什么:
- 我得到了一个键的值,例如,在这种情况下,我得到的是key1的字符串值“string1”
- 我在“Items”数组中搜索 key1 值为“string1”的对象。 (每个对象都有一个唯一的 key1 值)
- 我想找到我在上一步找到的同一个对象中的 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"
}
]
我试图在 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"
我想做什么:
- 我得到了一个键的值,例如,在这种情况下,我得到的是key1的字符串值“string1”
- 我在“Items”数组中搜索 key1 值为“string1”的对象。 (每个对象都有一个唯一的 key1 值)
- 我想找到我在上一步找到的同一个对象中的 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"
}
]