如何获取mongodb中url的最后一部分?

时间:2017-03-13 22:21:44

标签: mongodb

我有一个数据库,其格式为:http://www.website.com/stuff/more_stuff/part_i_want。如何更新该格式的所有数据,只包含网址的最后一部分(在最后一个'/'之后)?

例如: 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,所以我不知道语法是否接近正确。任何帮助将不胜感激。

谢谢!

2 个答案:

答案 0 :(得分: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

上阅读有关这些JavaScript的更多信息

答案 1 :(得分:0)

您可以使用$project使用单个$split阶段执行聚合,以生成由/分隔的数组,并将最后一个元素设为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);