gpt4 book ai didi

javascript - 将 "programmatic"数组推送到对象的数组属性

转载 作者:行者123 更新时间:2023-12-03 03:26:44 26 4
gpt4 key购买 nike

我正在构建一个同义词库应用程序,对于这个问题,关键是我正在为特定单词(例如 - “feline”、“tomcat”)添加同义词列表(具有相同含义的单词) "、"puss"是 "cat"的同义词)

我有一个 Word 对象,它有一个属性 - “同义词” - 它是一个数组。我将向 Word 同义词属性添加同义词数组。根据MongoDb文档see here ,将数组的所有索引一次附加到文档的数组属性的唯一方法是尝试以下操作:

db.students.update(
{ _id: 5 },
{
$push: {
quizzes: {
$each: [ { wk: 5, score: 8 }, { wk: 6, score: 7 }, { wk: 7, score: 6 } ],
}
}
}
)

在我们进一步冒险之前,让我们重写该解决方案以适合我的数据。

db.words.update(
{ baseWord: 'cat' },
{
$push: {
synonyms: {
$each: [ { _id: 'someValue', synonym: 'feline' }, { _id: 'someValue', synonym: 'puss' }, { _id: 'someValue', synonym: 'tomcat' } ],
}
}
}
)

漂亮又简洁,但不是我想要做的。

如果您事先不知道数据并且有一个想要输入的动态数组怎么办?我当前的解决方案是拆分数组并运行 forEach() 循环,从而将数组附加到 Word 对象的同义词数组属性,如下所示:

//req.body.synonym = 'feline,tomcat,puss';
var individualSynonyms = req.body.synonym.split(',');

individualSynonyms.forEach(function(synonym) {

db.words.update(
{ "_id": 5 },
{ $push: //this is the Word.synonyms
{ synonyms:
{
$each:[{ //pushing each synonym as a Synonym object
uuid : uuid.v4(),
synonym:synonym,
}]
}
}
},{ upsert : true },
function(err, result) {
if (err){
res.json({ success:false, message:'Error adding base word and synonym, try again or come back later.' });
console.log("Error updating word and synonym document");
}
//using an 'else' clause here will flag a "multiple header" error due to multiple json messages being returned
//because of the forEach loop
/*
else{
res.json({ success:true, message:'Word and synonyms added!' });
console.log("Update of Word document successful, check document list");
}
*/
});
//if each insert happen, we reach here
if (!err){
res.json({ success:true, message:'Word and synonyms added!.' });
console.log("Update of Word document successful, check document list");
}
});
}
  • 这按预期工作,但您可能会注意到并在底部发出问题,其中有一个注释掉的 ELSE 子句,以及对“if(!err)”的检查。如果执行 ELSE 子句,我们会收到“多个 header ”错误,因为循环会导致单个请求出现多个 JSON 结果。

除此之外,“if(!err)”将引发错误,因为它没有 .update() 函数回调中的“err”参数的范围。- 如果有一种方法可以避免使用 forEach 循环,并直接将同义词数组提供给单个 update() 调用,那么我可以在回调中使用 if(!err)。

您可能会想:“只需删除 'if(!err)' 子句”,但仅发送 JSON 响应而不事先进行某种最终错误检查(无论是 if、else、else if 等)似乎不干净..

我在文档或本网站上找不到这种特定的方法,对我来说,如果可以做到的话,这似乎是最佳实践,因为它允许您在发送响应之前执行最终的错误检查。我很好奇这是否真的可以做到。

我没有使用控制台,但在调用每个对象之前我包含了一个命名空间前缀以便于阅读。

最佳答案

自从 $each 以来就不需要“迭代”了采用“数组”作为参数。简单.map().split() 生成的数组附加数据:

db.words.update(                                
{ "_id": 5 },
{ $push: {
synonyms: {
$each: req.body.synonym.split(',').map(synonym =>
({ uuid: uuid.v4, synonym })
)
}
}},
{ upsert : true },
function(err,result) {
if (!err){
res.json({ success:true, message:'Word and synonyms added!.' });
console.log("Update of Word document successful, check document list");
}
}
);

所以.split()从字符串生成一个“数组”,您可以使用 .map() 对其进行“转换”转换为 .split() 元素中的 uuid 值和 "synonym" 数组。这是一个直接应用 $each 的“数组”到$push操作。

一个请求。

关于javascript - 将 "programmatic"数组推送到对象的数组属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46288093/

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