2017-01-10 8 views
0

У меня есть mongodb collection с около 4-5 миллионами documents. Он имеет поле с именем "role": "admin". Я хочу сделать, чтобы преобразовать все роли в массив i.e "role": ["admin"].mongo-db: Преобразование строки в массив

Я предпочитаю not to use forEach петлю. Пожалуйста, помогите мне с этим. Я немного новичок в mongodb.

old documents

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

в new documents

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

Обратитесь к этому ссылка-> http://stackoverflow.com/questions/7401394/mongodb-type-change-to -array –

+0

Yah, видел это сообщение раньше, но не хотел использовать db.eval, поскольку он блокирует db, пока это не завершится. – iamsaksham

+1

Не думаю, что мы можем сделать это, не используя forEach. Почему вы предпочитаете, чтобы вы не использовали forEach? – superUser

ответ

2

вы могли бы сделать это с помощью агрегации, как это (непосредственно из оболочки):

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 конечно, если вы хотите сохранить другие поля, просто добавьте их в этап $ group следующим образом: "fieldname": {$ first: "$ fieldname"} – felix

Смежные вопросы