2017-01-24 5 views
0

Ich bin ein bisschen neu zu mongodb, und ich habe eine Situation.

Die Einträge in meiner mongodb Sammlung ist um 300k, benutzte ich mongodb aggregate alle alten Einträge, um neue zu migrieren und mein Code sieht aus wie

collection.aggregate([ 
    { $group: { 
    _id: "$_id", 
    "new_id" : {$substr : [{$first: "$old_id"}, 2,-1]}, //error exists here 
    "new_roles": {$push: "$old_role"}, 
    } 
    }, 
    { $out: newCollection} 
], {allowDiskUse:true}, function (updateError, updateResult) { 
    if (!updateError) { 
    return cb(false, true); 
    } else { 
    return cb(true, false); 
    } 
}) 

Was ich erreichen will, dass ich Teilzeichenfolge nehmen wollen von old_id und setzen Sie es in new_id. Die alte_id der alten Sammlung sieht wie a-112a-34311 aus. Ich möchte a- von diesen alten IDs entfernen und es in neue ID setzen.

Ich habe versucht, mit dem obigen Code, aber es zeigt Fehler, dass The $substr accumulator is a unary operator. Ich habe versucht, nach dem Fehler, aber kein Glück zu suchen

Antwort

1

Sie können $ substr nicht in der Stufe $ group verwenden, da es kein Akkumulatoroperator ist. Sie müssen dies in einem $ Projektabschnitt wie diesem tun:

collection.aggregate([ 
    { $group: { 
    _id: "$_id", 
    "new_id" : {$first: "$old_id"}, 
    "new_roles": {$push: "$old_role"}, 
    } 
    }, 
    {$project: { 
     "new_id": {$substr: ["$new_id", 2, -1]}, 
     "new_roles": 1 
    } 
    }, 
    { $out: newCollection} 
], {allowDiskUse:true}, function (updateError, updateResult) { 
    if (!updateError) { 
    return cb(false, true); 
    } else { 
    return cb(true, false); 
    } 
})