2017-03-13 3 views
1

Ich habe eine Datenbank mit einer Spalte von Daten im Format: http://www.website.com/stuff/more_stuff/part_i_want. Wie aktualisiere ich alle Daten in diesem Format, um nur den letzten Teil der URL (nach dem letzten '/') zu haben?Wie bekomme ich den letzten Teil einer URL in Mongodb?

Zum Beispiel: http://www.website.com/stuff/more_stuff/part_i_want -> part_i_want

Ich dachte an so etwas wie dies zu tun:

db.table.aggregate([ 
    { $project : { $split: ["url", "/"] }, qty : 1 } } 
]) 

db.table.update([ 
    {$set : { "url" : "url [ url.length - 1 ] } } 
]) 

Dies ist mein erstes Mal mongodb verwenden, so dass ich keine Ahnung, ob die Syntax selbst ist nah dran zu sein. Jede Hilfe wäre willkommen.

Danke!

Antwort

0

Sie können folgendermaßen vorgehen, um die Liste der gewünschten Teile zu erhalten und alles mit ihnen zu tun, hier habe ich sie in eine andere Tabelle eingefügt, wie Sie vorgeschlagen haben;

db.table.aggregate([ 
    { $project : { item : { $split: ["$item", "/"] }, _id : 0 } } 
]).map(obj => obj.item[obj.item.length - 1]) 
.forEach(result => db.table2.insert({wanted: result}) 

Dann;

db.table2.find({}, {_id: 0}) 

kehrt

{"wanted": "part_i_want"} 
{"wanted": "part_i_want2"} 

für Daten;

db.table.insert([ 
    { item: "http://www.website.com/stuff/more_stuff/part_i_want"}, 
    { item: "http://www.website.com/stuff/more_stuff/part_i_want2"} 
]); 

auf der Online-Konsole getestet here

Sie können auch lesen Sie mehr über diese JavaScript auf MongoDB Cursor here

0

Sie eine Aggregation mit einer einzigen $project Stufe durchführen können $split mit dem Array zu erzeugen, begrenzt durch / und nehmen Sie das letzte Element mit arrayElemAt:

db.table.aggregate(
    [{ 
     $project: { 
      url: { 
       $arrayElemAt: [{ $split: ["$url", "/"] }, -1] 
      } 
     }, 
    }] 
) 

Die Aggregation kann geben die Ergebnisse in eine temporäre Sammlung mit $out und von einem bulkWrite gefolgt werden alle Felder aus der temporären Sammlung in die erste Sammlung zu aktualisieren:

var bulk = db.table.initializeUnorderedBulkOp() 

query = [{ 
    $project: { 
     url: { 
      $arrayElemAt: [{ $split: ["$url", "/"] }, -1] 
     } 
    }, 
}, { 
    $out: "tempo" 
}]; 

db.table.aggregate(query); 

var bulkOps = db.tempo.find().map(function(doc) { 
    return { 
     "updateOne": { 
      "filter": { "_id": doc._id }, 
      "update": { "$set": { "url": doc.url } } 
     } 
    }; 
}); 

db.table.bulkWrite(bulkOps); 
Verwandte Themen