2014-03-26 91 views
0

鑑於這種文檔結構:的MongoDB - 添加文檔到文檔的列表(如果唯一)

{ 
    "_id": date, 
    "list": [ 
     { hour: "something", 
      hour: "something else" 
     } 
    ] 
} 
  1. 如何UPSERT基礎上,_id一個新的文檔?
  2. 如何檢查一個密鑰是否存在於我的子文檔中並插入到該文檔中?

我已經試過:

col.update({'_id':my_str}, {'_id':my_str, 'list':{'$addtoset':["14":"yet another thing"]}}, {'$upsert':'true'}) 

編輯:

更新了我的結構:

{ 
    _id: date, 
    hours: [ 
       { "0": "something"}, 
       { "1": "something else"}, 
        ... 
      ] 
} 
+0

你的結構很奇怪。你有一個包含關聯數組的元素列表? – njzk2

+0

有沒有更好的方式來構建我的數據? – Jeff

+0

作爲一個,'list'不應該被稱爲列表,這是令人困惑的。 ('小時'可能是合適的)。那麼它可能應該是一個字典,而不是一個列表。最後,你考慮過mongoengine嗎? – njzk2

回答

0

不能直接修改與pymongo內部列表屬性,需要拉整個文檔並重新發布:

my_doc = col.find_one({'_id': my_str}) 
if my_doc is not None: 
    # Document exist, modify it 
    my_doc['hours'].append({"14": "yet another thing"}) 
    col.update({'_id': my_str}, my_doc) 
else: 
    # Insert the new document with all the new attributes 
    col.insert({'_id': my_str, 'hours': [{"14": "yet another thing"}]}) 
+0

如果{「14」:「一個字符串」}已經在那裏?這會更新現有的子文檔還是隻是附加到它? – Jeff

+0

由於您的數據結構是一個列表,它會添加一個副本。如果你想擁有唯一的值,那麼'小時'應該是一個字典,而不是一個列表(在這種情況下,小時[14]的值將被新字符串替換) – Javier

+0

謝謝。我結束了你說的話,但我改變了我的結構,成爲一個字典列表。 – Jeff

相關問題