我需要一些帮助来创建monogdb查询,从包含短语'?=view‘的特定URL中删除结尾。例如,三个URL是:
https://stackoverflow.com/questions/ask
https://stackoverflow.com/questions/ask100?=view
https://stackoverflow.com/questions/ask101输出将为:
https://stackoverflow.com/questions/ask
https://stackoverflow.com/questions/ask100
https://stackoverflow.com/questions/ask101采集示例:
Product{
id: ...
URL: 'https://stackoverflow.com/questions/ask'}提前感谢
发布于 2020-01-01 18:25:44
下面的aggregation with update查询从每个字符串的末尾去掉"?=view“。正则表达式/.+\?=view$/查找以子字符串"?=view“结尾的字符串。
db.test.aggregate( [
{
$match: { url: { $regex: /.+\?=view$/ } }
},
{
$addFields: {
url: { $split: [ "$url", "?" ] }
}
}
] ).forEach( doc => db.test.updateOne( { _id: doc._id }, { $set: { url: doc.url[0] } } )发布于 2020-01-01 19:06:54
另一种解决方案是在$split之后使用$arrayElemAt来获取不带查询字符串的URL。
db.Product.aggregate([
{
$project: {
id: 1,
URL: {
$arrayElemAt: [
{
"$split": [
"$URL",
"?"
]
},
0
]
}
}
}
])发布于 2020-01-01 20:06:28
您可以简单地使用正则表达式"/?=view"聚合以查找所有匹配的记录,然后循环逐个更新它,如下所示:
> db.product.find()
{ "_id" : ObjectId("5e0c86a4a2e621133ea3b041"), "url" : "https://stackoverflow.com/questions/ask" }
{ "_id" : ObjectId("5e0c86b1a2e621133ea3b042"), "url" : "https://stackoverflow.com/questions/ask100?=view" }
{ "_id" : ObjectId("5e0c86c1a2e621133ea3b043"), "url" : "https://stackoverflow.com/questions/ask101" }
>
>
> db.product.aggregate( [
{ $match: { url: { $regex: "/?=view" } } },
{ $addFields: { url: { $split: [ "$url", "?" ] } } }
]).forEach(function(matchedDoc) {printjson(matchedDoc);
db.product.updateOne({_id: matchedDoc._id}, {$set: {url: matchedDoc.url[0]} } )}
)
{
"_id" : ObjectId("5e0c86b1a2e621133ea3b042"),
"url" : [
"https://stackoverflow.com/questions/ask100",
"=view"
]
}
> db.product.find()
{ "_id" : ObjectId("5e0c86a4a2e621133ea3b041"), "url" : "https://stackoverflow.com/questions/ask" }
{ "_id" : ObjectId("5e0c86b1a2e621133ea3b042"), "url" : "https://stackoverflow.com/questions/ask100" }
{ "_id" : ObjectId("5e0c86c1a2e621133ea3b043"), "url" : "https://stackoverflow.com/questions/ask101" }
>https://stackoverflow.com/questions/59551494
复制相似问题