2013-08-21 45 views
0

我想創建一個多維集合。 收藏有地點。每個地點都有用戶,每個用戶都有照片。Multidimentional addToSet/Push mongodb

現在,集合具有位置,例如,

{ "_id" : ObjectId("52148266c36b4403e855bef9"), 
    "latitude" : 48.958, 
    "id" : "110600715", 
    "longitude" : 9.13, 
    "name" : "Coffee" } 

我的最終結果必須是這樣的:

{ "_id" : ObjectId("52148266c36b4403e855bef9"), 
    "latitude" : 48.958, 
    "id" : "110600715", 
    "longitude" : 9.13, 
    "name" : "Coffee", 
    'users' : [ 
     { 
     'user' : 45, 
     'username' : 'Me', 
     'user_fullname': 'Name Lastname', 
     'photos': [ 
      { 
      'photo_id' : 10, 
      'created_time' : 1236456712, 
      'link' : 'http...', 
      'image' : 'http...', 
      'tags' : 'a' 
      }, 
      {...} 
      ] # end of photos list 
     }, 
     {...} 
     ] #end of users list 
} 

如果用戶不存在,創建新的用戶,並添加了第一張照片。 如果用戶存在,請添加帶有唯一photo_id的下一張圖片。

這是我試過以下的一個示例。我正在用python使用pymongo。我知道我錯過了第二個$addToSet或類似的東西。

db.col.update({'_id':location_id['_id']}, 
      { '$addToSet' : 
       { 
       'user' : int(i['user']['id']), 
       'username' : i['user']['username'], 
       'user_fullname': i['user']['full_name'], 
       'photos': 
        { 
        'photo_id' : i['id'],         
        'created_time' : int(i['created_time']), 
        'link' : i['link'], 
        'image' : i['images']['url'], 
        'tags' : i['tags'] 
        } 
       } 
      } 
     ) 
+0

可能重複[是否有可能在同一更新中多次使用$ addToSet?](http://stackoverflow.com/questions/16595195/is-it-possible-to-utilize-addtoset-multiple-times -in最相同 - 更新) – WiredPrairie

回答

0

你不能在一個操作中做到這一點 - 你可以做一個更新,並檢查它有多少更新。

這裏我們使用默認寫入關注(從MongoClient),例如:w:1,我們首先查詢並期望那裏是該位置的用戶:

result = db.col.update(
      {'_id':location_id['_id'], "users": {"$elemMatch": {'user' : int(i['user']['id'])}}}, 
      {'$addToSet': {"photos": {'photo_id' : i['id'],         
            'created_time' : int(i['created_time']), 
            'link' : i['link'], 
            'image' : i['images']['url'], 
            'tags' : i['tags']}}}); 

如果結果[「N」]等於0表示我們不匹配,並且該位置沒有用戶i[user]。所以我們也可以使用$addToSet

if result['n'] == 0: 
    db.col.update({'_id':location_id['_id']}, 
     { '$addToSet' : 
      { 
      'user' : int(i['user']['id']), 
      'username' : i['user']['username'], 
      'user_fullname': i['user']['full_name'], 
      'photos': 
       [{'photo_id' : i['id'],         
        'created_time' : int(i['created_time']), 
        'link' : i['link'], 
        'image' : i['images']['url'], 
        'tags' : i['tags'] 
       }] 
      } 
     }); 

我們正在做兩個操作 - 有這可能意味着第二個更新不更新任何東西,因爲其他線程已經添加了用戶對理論的競爭條件位置。如果你想確保它更新,你應該再次檢查第二個更新結果,然後可能返回。這取決於這種競爭條件是多麼的真實。

相關問題