【发布时间】:2021-12-08 22:56:55
【问题描述】:
我很难将另一个字段添加到 user 集合的所有记录中,每个文档都有一个值。我熟悉将$set 与db.model.updateMany 和$addFields 与聚合管道一起使用,我过去曾使用这两种方法来解决问题,在这种情况下,我必须在添加值之前执行一些逻辑/计算,这就是我的问题所在。
说,我有这样的架构:
{
"users": [
{
"wallets": {...},
"avatar": "",
"isVerified": false,
"suspended": false,
"country": "Nigeria",
"_id": "123",
"resetPasswordToken": "",
"email": "example@gmail.com",
"phone": "08012398743",
"name": "Agbakwuru Nnaemeka Kennedy ",
"role": "user",
},
{...}
}
我想添加一个新字段 phoneNumber,它将采用现有字段 phone 的值,但在添加之前,我想在其上运行一个逻辑,因为某些电话值具有其中大多数空格的格式不正确,我想将国家代码添加到 phone 值之前,然后将其添加到新的 phoneNumber 字段中。
我能够使用来自 Mongoose db.mode.aggregate 方法的游标和 $match 过滤器来完成这项工作,并使用聚合 $addFields 管道将字段添加到每个文档中,这证明需要花费大量时间,我不得不停止操作,因为运行时间太长。
我愿意相信有更好的方法,拜托,我将不胜感激。
编辑:
这是我正在使用的聚合:
const userCursor = User.aggregate([{$match: {phone: {$exists: true}}}]);
for await (const doc of userCursor) {
await User.findByIdAndUpdate(doc._id, {$set: {
phoneNumber: convertPhoneNumber({phoneNumber: doc.phone.replace(/\s+/g, "")})}
});
}
convertPhoneNumber 是我在我的实用程序中定义的一种辅助方法,用于将国家/地区交易代码添加到电话号码。
【问题讨论】:
-
你能分享一下你正在使用的聚合吗?我们需要确定瓶颈所在,以便更好地帮助您。
-
@ray 我已经编辑了我的问题以包含我正在使用的聚合,谢谢。
标签: javascript node.js mongodb mongoose nosql