gpt4 book ai didi

javascript - Mongodb 查看数组中的所有项目是否存在并更新,否则插入

转载 作者:太空宇宙 更新时间:2023-11-04 00:42:16 25 4
gpt4 key购买 nike

我有一个 mongo 标签集合,当用户输入标签数组时,我想要执行以下操作:

如果数组中存在标签,则更新计数如果数组中不存在标签,则插入计数为0

我目前有:

QuestionTags.update({'tag': {$in: tagArray}}, {$inc : {'count': +1} }, { upsert: true });

QuestionTags 是数据库集合的 Mongoose 架构。

这似乎不起作用。我输入了一系列新标签,但它们没有被添加,现有标签也没有增加。

是否有一种方法可以处理此问题,而无需循环遍历 tagArray 并对数组中的每个项目进行数据库调用?

更新:将我的代码更改为这样

QuestionTags.update({'tag': {$in: req.body.tags}}, {$inc : {'count': +1} }, { upsert: true, multi: true });
QuestionTags.find({'tag' :{$nin: req.body.tags}}, function(err, newTags) {
console.log("New Tags :" + newTags);
var tagArray = [];
newTags.forEach(function(tag){
var tagObj = {
tag: tag,
count: 1
}
tagArray.push(tagObj);
});
QuestionTags.collection.insert(tagArray);
});

但是,newTags 为空。 QuestionTags 集合当前为空,因此不应为 null。

最佳答案

我认为您可以通过几个查询来完成此操作,而无需循环查询。

1) 更新现有标签计数:您的查询有效:

QuestionTags.update({'tag': {$in: tagArray}}, {$inc : {'count': +1} },{multi: true} );

2) 查找新标签:

QuestionTags.find({},function(err, tags) {
var newTagObj = [];

// tags is originally an array of objects
// creates an array of strings (just tag name)
tags = tags.map(function(tag) {
return tag.tag;
});

// returns tags that do not exist
var newTags = tagArray.filter(function(tag) {
// The count = 1 can be done here
if (tags.indexOf(tag) < 0) {
tag.count = 1;
}

return tags.indexOf(tag) < 0;
});

// creates tag objects with a count of 1
// adds to array
// (this can be done in the previous loop)
newTags.forEach(function(tag) {
var tagObj = {
tag: tag,
count: 1
}
newTagObj.push(tagObj);
});

这将为您提供数据库中不存在的标签数组。

3) 在 find 回调中使用 2 的结果插入新标签:

QuestionTags.collection.insertMany(newTagObj);

关于javascript - Mongodb 查看数组中的所有项目是否存在并更新,否则插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36183216/

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