我有一个数据库,其格式为: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,所以我不知道语法是否接近正确。任何帮助将不胜感激。
谢谢!
答案 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);