2017-03-13 41 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

你也可以阅读更多有关这些JavaScript有关MongoDB游标上here

0

您可以使用$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);