2017-03-13 14 views
1

私は、http://www.website.com/stuff/more_stuff/part_i_wantという形式のデータの列を持つデータベースを持っています。 URLの最後の部分(最後の '/'の後ろ)だけを持つように、その形式のすべてのデータを更新するにはどうすればよいですか?例えばmongodbでURLの最後の部分を取得するにはどうすればよいですか?

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

私はこのような何かをやって考えていた:

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

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

これは、MongoDBのを使用して、私の初めてなので、構文が偶数の場合、私は考えています正しいことに近い。どんな助けもありがとう。

ありがとうございます!

答えて

0

希望するパーツのリストを取得するには、次の操作を行います。希望するパーツは、ここでは別のテーブルに挿入します。

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

次に、データの

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

戻り

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

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"} 
]); 
オンラインコンソールでテスト

here

また、あなたは、MongoDBのカーソルhere

0

にこれらのJavaScriptについての詳細を読むことができますあなたは区切り配列を生成するために$splitを使用して、単一の$project段階で集計を実行することができます/によって最後の要素を取り、arrayElemAt

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

集約$outとの一時的なコレクションへの出力結果をすることができますし、最初のコレクションに一時的なコレクションからすべてのフィールドを更新するためにbulkWriteが続くこと:

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); 
関連する問題