2017-01-10 6 views
0

私はmongodb collectionに約4-5百万のdocumentsを持っています。名前は"role": "admin"です。私がしたいのは、すべての役割を配列に変換することです。つまり、"role": ["admin"]です。mongo-db:文字列を配列に変換する

私はnot to use forEachループが好きです。これで私を助けてください。私はmongodbに少し新しいです。 new documents

{ 
    "role": ["admin"] 
} 
{ 
    "role": ["mod"] 
} 
+0

は、このリンク - を参照してください元に戻すことはできませんよう

は気をつけてください> http://stackoverflow.com/questions/7401394/mongodb-type-change-to -array –

+0

ええ、以前はそのポストを見ましたが、db.evalを使用したいと思っていませんでした。データベースが完全に完了するまでロックします。 – iamsaksham

+1

forEachを使用せずにこれを行うことはできません。なぜあなたはそれぞれを使いたくないのですか? – superUser

答えて

2

old documents

{ 
    "role": "admin" 
} 
{ 
    "role": "mod" 
} 

あなたは(直接シェルから)このように、この使用して集約を行うことができます:

db.collection.aggregate([ 
    {$group: { 
    _id: "$_id", 
    role: {$push: "$role"} 
    } 
    }, 
    {$out: "newCollection"} 
]) 

$グループステージは、これらの結果を生成します。 :

{ "_id" : ObjectId("5874a728cf097894d781d7f0"), "role" : [ "mod" ] } 
{ "_id" : ObjectId("5874a724cf097894d781d7ef"), "role" : [ "admin" ] } 

と$ outはそれを特定のコレクション(新しいコレクションまたは既存のコレクションにすることができます)に書き込みます。 $うちに既存のコレクションをoverwrittingときに操作

+0

あなたのやり方は私が望む方法ですが、私は役割とともに多くの追加フィールドを持っています。ビットを変更して助けてもらえますか? – iamsaksham

+0

@iamsaksham他のフィールドを保持したい場合は、 "fieldname":{$ first: "$ fieldname"}のように$ groupステージに追加してください – felix

関連する問題