2017-04-27 1 views
0

のフィールドを更新するには、[0] SQLでのこのようなだけで何かを.address SQLのどちらかで作業します。ちょうどそれを私が必要とするものに合理的にするために置く。挿入と私は電子メールですべてのコレクションフィールドprofile.emailを更新したいMongoDBの

それはこのようなものですが、動作していない:

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(...)。関数ではありません: @(シェル):1:1 – Mehr

+0

Jsファイルから実行する必要がありますか? – Mehr

+0

updated .. robomongoから実行 – sidgate

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

あなたの仕事は、2つのステップがあります。 1.メールを取得アドレスは、 "db.users.find"によって実行されます。 2. "db.users.update"によって実行されるドキュメントを更新します。

+0

私はそれだけでなく、特定のIDのコレクション全体に適用したいです。 _id部分を削除するだけで、このように動作しますか? – Mehr

+1

forEach関数を使用することができます。https://docs.mongodb.com/manual/reference/method/cursor.forEach/ –

関連する問題