gpt4 book ai didi

javascript - 有条件地更新/插入并添加到数组

转载 作者:行者123 更新时间:2023-11-30 21:20:16 25 4
gpt4 key购买 nike

我有包含一些订单信息的 .tsv 文件。在重新制作我的脚本后,我得到了这个。

[{"order":"5974842dfb458819244adbf7","name":"Сергей Климов","email":"wordkontent@gmail.com"},
{"order":"5974842dfb458819244adbf8","name":"Сушков А.В.","email":"mail@wwwcenter.ru"},
{"order":"5974842dfb458819244adbf9","name":"Виталий","email":"wawe2012@mail.ru"},
...
and so on

我有 Mongoose 的模式。

var ClientSchema = mongoose.Schema({
name:{
type: String
},
email:{
type: String,
unique : true,
required: true,
index: true
},
forums:{
type: String
},
other:{
type: String
},
status:{
type: Number,
default: 3
},
subscribed:{
type: Boolean,
default: true
},
clienturl:{
type: String
},
orders:{
type: [String]
}
});

clienturl 是由函数生成的8个字符长度的密码。

module.exports.arrayClientSave = function(clientsArray,callback){
let newClientsArray = clientsArray
.map(function(x) {
var randomstring = Math.random().toString(36).slice(-8);
x.clienturl = randomstring;
return x;
});
console.log(newClientsArray);
Client.update( ??? , callback );
}

但我不明白如何进行更新。只是如果电子邮件已经存在推送订单数组,但不重写所有其他字段。但如果电子邮件不存在 - 使用 clienturl 等保存新用户。谢谢!

最佳答案

可能最好的处理方式是通过 .bulkWrite()这是一种 MongoDB 方法,用于在具有“单个”响应的“单个”请求中发送“多个操作”。这抵消了控制每个“循环”项目的问题和响应中的异步函数的需要。

module.exports.arrayClientSave = function(clientsArray,callback){
let newClientsArray = clientsArray
.map(x => {
var randomstring = Math.random().toString(36).slice(-8);
x.clienturl = randomstring;
return x;
});
console.log(newClientsArray);

let ops = newClientsArray.map( x => (
{ "updateOne": {
"filter": { "email": x.email },
"update": {
"$addToSet": { "orders": x.order },
"$setOnInsert": {
"name": x.name,
"clientUrl": x.clienturl
}
},
"upsert": true
}}
));

Client.bulkWrite(ops,callback);
};

主要思想是您使用 "upsert" MongoDB 的功能来驱动“创建或更新”功能。 $addToSet在哪里仅将 "orders" 属性信息附加到尚未存在的数组中,并且 $setOnInsert实际上仅当操作实际上是 “upsert” 时才会生效,并且当操作匹配现有文档时应用。

也可以在 .bulkWrite() 中应用它当与支持它的 MongoDB 服务器对话时,这变成了“单个异步调用”,并且是大于或等于 MongoDB 2.6 的任何版本。

不过要点具体.bulkWrite() API,如果连接到的服务器实际上支持“批量”操作,API 本身将“检测”。如果没有,这将“降级”为单个“异步”调用而不是一批。但这是由“驱动程序”控制的,它仍然会与您的代码交互,就好像它实际上是一个请求和响应一样。

这意味着处理“异步循环”的所有困难实际上都在驱动程序软件本身中解决了。要么被支持的方法否定,要么以一种让您的代码易于使用的方式“模拟”。

关于javascript - 有条件地更新/插入并添加到数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45264918/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com