2015-05-06 65 views
2

我應該從一開始:我知道MongoDB和一般的文檔樣式數據庫。

我有一個集合,它看起來是這樣的:

{ 
    "_id" : ObjectId("554a5e72b16f31ff0894310e"), 
    "title" : "ABC", 
    "admins" : [ 
     "personA", 
     "personB", 
    ], 
    "email_address" : "[email protected]" 
} 
{ 
    "_id" : ObjectId("554a5e72b16f31ff0894310f"), 
    "title" : "Junk Site", 
    "admins" : [ 
     "personA", 
     "personB" 
    ], 
    "email_address" : "[email protected]" 
} 
{ 
    "_id" : ObjectId("554a5e72b16f31ff08943110"), 
    "title" : "Company Three Site", 
    "admins" : [ 
     "personC" 
     "personD", 
    ], 
    "email_address" : "[email protected]" 
} 

我需要做的,是從Company One追加管理員列表,以Company Three這樣Company Three現在有四個管理員(A,B,C ,D)。

我嘗試以下,因爲它似乎相當直截了當,我 - 從源頭獲取數據,並直接附加到目標:

db.runCommand({ 
    findAndModify : 'sites', 
    query : {'title' : 'Company Three Site'}, 
    update : { '$addToSet' : 
       {'admins' : 
       db.projects.find({'title' : 'ABC'}, {'_id' : 0, 'admins' : 1} 
       } 
      } 
}) 

然而,這並不正常工作。

我仍然在試圖找出辦法,我可以直接做到這一點,但問題...

1)這甚至可能通過使用單個命令,或者我需要拆分這個嗎? 2)我的邏輯思想訓練是否有意義,或者我應該做一些更傳統的MongoDB風格數據庫的其他/更簡單的方法嗎?

+0

爲什麼'_id'所有三個文件一樣嗎?這是不允許的 –

+0

@ExplosionPills抱歉在嘗試創建示例時複製粘貼錯誤 – Sagar

回答

2

db.projects.find的實際返回光標,你肯定不希望添加到您的集合。由於您事先知道您只會找到一個值,因此您可以使用.next().admin專門從光標中獲取屬性 - 但請記住,這將只有與從.find返回的第一個值一起使用。否則,我認爲你將不得不使用循環。

$addToSet也將添加陣列作爲一個整體,所以不是你要append multiple values using $each

一起:

db.runCommand({ 
    findAndModify: 'sites', 
    query: {'title': 'Company Three Site'}, 
    update: { 
     $addToSet: { 
      "admins": { 
       $each: db.projects.find(
        {"title": "ABC"}, 
        {"_id": 0, "admins": 1} 
       ).next().admins 
      } 
     } 
    } 
}) 
+0

謝謝!這工作完美! – Sagar

2

這對於原子更新是不可能的。但是,解決方法是使用find()方法查詢源集合,並使用遊標的forEach()方法遍歷結果,獲取數組並使用$addToSet運算符和$each修飾符更新目標集合。

讓我們證明這一點插入到測試集上面的示例文件:

db.test.insert([ 
{ 
    "title" : "ABC", 
    "admins" : [ 
     "personA", 
     "personB" 
    ], 
    "email_address" : "[email protected]" 
}, 
{ 
    "title" : "Junk Site", 
    "admins" : [ 
     "personA", 
     "personB" 
    ], 
    "email_address" : "[email protected]" 
}, 
{ 
    "title" : "Company Three Site", 
    "admins" : [ 
     "personC", 
     "personD" 
    ], 
    "email_address" : "[email protected]" 
} 
]) 

以下操作將增加從公司「ABC」的管理員數組元素公司「公司三網站」管理員陣:

db.test.find({"title" : "ABC"}).forEach(function (doc){ 
    var admins = doc.admins; 
    db.test.update(
     {"title" : "Company Three Site"}, 
     { 
      "$addToSet": { 
       "admins": { "$each": admins } 
      } 
     }, 
     { "multi": true } 
    );      
}); 

查詢集合文件與公司 「公司三網站」 db.collection.find({"title" : "Company Three Site"});

將產生:

/* 0 */ 
{ 
    "_id" : ObjectId("554a7dc35c5e0118072dd885"), 
    "title" : "Company Three Site", 
    "admins" : [ 
     "personC", 
     "personD", 
     "personA", 
     "personB" 
    ], 
    "email_address" : "[email protected]" 
} 
相關問題