2017-04-27 60 views
0

更新字段我想更新所有電子郵件的收集場profile.email [0]。地址只是像這樣在SQL:插入和MongoDB中

update dbo.users 
    set profile.email=emials.[0].address 

我知道這個愚蠢的代碼獲得了」 t也可以用於SQL。只是爲了讓我明白我需要什麼。

它是這樣的,但是不工作:

db.getCollection('users').update(
    {_id: "QYoHQkTuTXnEC6Pws"}, 
    {$set: 
     {'profile.email': db.getCollection('users').aggregate({$match: {_id:'QYoHQkTuTXnEC6Pws'}}, 
      {$project: {_id:0,email: {$arrayElemAt: 
['$emails.address',0]}}}) 
     } 
    } 
) 

的結果是不正確的:

"email" : { 
     "_batch" : [ 
      { 
       "email" : "[email protected]" 
      } 
     ], 
     "_useReadCommands" : true, 
     "_cursorid" : NumberLong(0), 
     "_batchSize" : undefined, 
     "_ns" : "meteor.users", 
     "_db" : { 
      "_mongo" : { 
       "slaveOk" : true, 
       "host" : "localhost:3001", 
       "defaultDB" : "", 
       "_readMode" : "commands", 
       "_writeMode" : "commands" 
      }, 
      "_name" : "meteor" 
     }, 
     "_collName" : "users", 
     "_cursorHandle" : {} 
    } 
+0

你的mongo版本是什麼? – sidgate

+0

mongo版本是3.4.0 – Mehr

回答

1

您必須迭代每個文檔並進行更新以實現預期結果。

db.users.find({}).forEach(function (user) { 
    db.users.update({_id: user._id}, {$set: {'profile.email': user.emails[0].address}}); 
}); 
+0

我在robomongo中運行代碼並得到這個錯誤TypeError:db.getCollection(...)。snapshot is不是函數: @(shell):1:1 – Mehr

+0

應該從Js文件執行嗎? – Mehr

+0

更新..從robomongo運行 – sidgate

-1
db.users.update({_id: "doc id"}, 
    {$set: {'profile.email': db.users.find({_id: "doc id"}).emails[0].address} 
}) 

你的任務有兩個步驟:1. 獲得的電子郵件地址,由「db.users.find」執行 2.更新由「db.users.update」執行的文檔

+0

我想將它應用於整個集合,而不僅僅是特定的Id。它是否像這樣工作只是通過刪除_id部分? – Mehr

+1

你可以使用forEach函數https://docs.mongodb.com/manual/reference/method/cursor.forEach/ –