簡體   English   中英

將MongoDB文檔中的嵌套字段組合到python數組中

[英]Combining nested fields in a MongoDB document into an python array

我對Python和MongoDB還是很陌生,並且在從事我的項目時正在學習。 在我的項目中,我有一個MongoDB文檔,看起來像運行以下命令后的樣子:

db.materials.insertOne({
"structure": {
    "sites": [
        {
            "xyz": [
                11,
                12,
                13
            ],
        },
        {
            "xyz": [
                21,
                22,
                23
            ],
        },
        {
            "xyz": [
                31,
                32,
                33
            ],
        }
    ]
}})

我想要的是生成一個結合每個“ xyz”列表的第3個元素的python數組。 即我希望數組為[13,23,33]。 在此示例中,我們只有3個“ xyz”列表,在我的實際代碼中,我任意地有許多“ xyz”列表。

我打算在提取每個列表的第3個組件之前,將所有xyz字段合並為一個列表。 但是,在我對如何進行操作感到困惑之前,我只能設法做到一半。 這是我在卡住之前嘗試過的方法:

for m in tqdm(db.materials.find({structure: {$exists: true}}, {"structure.sites.xyz":1})):
try:
  struc = m[structure]
  site = struc[sites]
  coord = site[xyz]

嘗試獲取每個xyz的列表后,我在這里遇到了瓶頸。 給出的錯誤是:

coord = site["xyz"]
TypeError: list indices must be integers or slices, not str

當我沒有以任何方式指定索引時,我對列表索引如何變成字符串而不是整數感到困惑。 另外,如果我需要特別指定索引,我該如何容納文檔中任意數量的“ xyz”列表?

我想知道的另一個問題是如何將每個“ xyz”列表的第3個元素提取到數組中,盡管我還沒有涉及到這一部分。

我知道此處顯示的嘗試次數有限,但這是我真正能夠做的一切,然后再空白下一步。 非常感謝任何指令以及其背后的邏輯。

最佳迷宮

您的sites值是字典的列表,而不是字典本身,您將需要過濾或迭代該列表以訪問每個字典。

還請注意,如果網站列表中除 “ xyz” 之外還包含其他網站,例如

"structure":{"sites":[{"xyz":[1, 2, 3]}, {"z":[4, 5, 6]}, {"x":[7, 8, 9]}]}}

您的投影將導致返回的值包含:

{"sites":[{"xyz":[1, 2, 3]}, {}, {}]}

這僅意味着您需要進行測試以確保當前對象具有“ xyz”,因此不會出現關鍵錯誤。

快速又骯臟:

    conn = MongoClient()
    db = conn["test"]
    result = list()
    for doc in db.materials.find({"structure.sites.xyz":{"$exists":1,_id:0}},{"structure.sites.xyz":1}):
      struct = doc["structure"]
      sites = struct["sites"]
      dsites = list()
      for s in sites:
        if s.has_key("xyz"):
           dsites.append(s["xyz"][2])
      result.append(dsites)

    print result

輸入的集合包含4個文檔:

{"structure":{"sites":[{"xyz":[11, 12, 13 ]}, {"xyz":[21, 22, 23 ]}, {"xyz":[31, 32, 33 ]}]}}
{"structure":{"sites":[{"xyz":[1, 2, 3 ]}, {"xyz":[4, 5, 6 ]}, {"xyz":[7, 8, 9 ]}]}}
{"structure":{"sites":[{"z":[1, 2, 3 ]}, {"y":[4, 5, 6 ]}, {"x":[7, 8, 9 ]}]}}
{"structure":{"sites":[{"xyz":[1, 2, 3 ]}, {"z":[4, 5, 6 ]}, {"x":[7, 8, 9 ]}]}

這將產生:

[[13.0, 23.0, 33.0], 
 [3.0, 6.0, 9.0], 
 [3.0]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM