mongoose的一个小问题,请各位大大们指教(Nodejs相关)

mongoose的一个小问题,请各位大大们指教(Nodejs相关)

那node练手抓糗白,使用mongoose存入mongodb,想解决重复内容的问题

//solution_one: fail, duplicated item still be saved. why??
*****
content: { type: String, unique: true},//参考《mongoose for application development》
*****
//solution_two: successful
****
articleSchema.path('/content').validae(function(value,respond){
Article.find({content: value},function(err,data){
if(err) return respond(false);
if(data.length) {
return respond(false)
}else{
return respond(true)
}
})
},'duplicated')
*****

现在我想如果查到存在重复项,然后对重复项做update,有没有推荐的代码,比如说类似solution_two。


2 回复

当然可以!根据你的需求,你希望在发现重复项时进行更新操作,而不是直接拒绝保存。下面是针对你问题的解决方案。

解决方案

我们可以修改 solution_two 来实现这一功能。首先,我们需要找到重复项,然后对其进行更新操作。以下是具体的代码示例:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

// 定义Schema
const articleSchema = new Schema({
    content: { type: String }
});

// 验证函数,用于检查是否存在重复项
articleSchema.pre('save', async function (next) {
    const Article = mongoose.model('Article', articleSchema);

    try {
        const existingArticle = await Article.findOne({ content: this.content });

        if (existingArticle) {
            // 如果存在重复项,则更新该文档
            await existingArticle.updateOne({ $set: { ...this._doc } });
            next(); // 继续保存操作
        } else {
            next(); // 没有重复项,继续保存操作
        }
    } catch (err) {
        next(err); // 错误处理
    }
});

// 创建模型
const Article = mongoose.model('Article', articleSchema);

module.exports = Article;

解释

  1. 验证函数:我们使用 articleSchema.pre('save') 来定义一个预保存钩子。在保存文档之前,它会检查数据库中是否已经存在具有相同 content 的文档。

  2. 查询重复项:使用 findOne 方法查询数据库中是否存在具有相同 content 的文档。

  3. 更新重复项:如果存在重复项,我们使用 updateOne 方法更新该文档的内容。这里我们假设 this._doc 包含了要更新的所有字段。你可以根据实际情况调整。

  4. 继续保存操作:如果不存在重复项,则正常保存新文档。

  5. 错误处理:在捕获到任何错误时,通过调用 next(err) 将错误传递给 Mongoose 的错误处理机制。

这种方法可以确保在发现重复项时进行更新操作,而不会因为重复数据而拒绝保存。希望这能帮助你解决问题!


根据你的描述,你希望在检测到重复项时进行更新操作。你可以通过在验证函数中添加更新逻辑来实现这一点。以下是一个示例代码,展示了如何在检测到重复项时进行更新操作。

示例代码

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const ArticleSchema = new Schema({
    content: { type: String }
});

ArticleSchema.pre('validate', function (next) {
    const article = this;
    
    Article.findOne({ content: article.content })
        .then((existingArticle) => {
            if (existingArticle) {
                // 如果找到重复项,则进行更新操作
                existingArticle.someField = article.someField; // 更新需要更新的字段
                return existingArticle.save();
            } else {
                next(); // 没有找到重复项,继续保存
            }
        })
        .catch(next); // 处理错误
});

const Article = mongoose.model('Article', ArticleSchema);

module.exports = Article;

解释

  1. pre('validate') 钩子

    • 在文档验证之前触发。
    • 使用 findOne 查找数据库中是否有相同 content 的文档。
    • 如果找到相同的文档,则进行更新操作,更新需要更新的字段(例如 someField)。
    • 如果没有找到相同的文档,则调用 next() 继续保存。
  2. 更新操作

    • 在找到重复项后,使用 save 方法更新现有文档。
  3. 错误处理

    • 如果查询或保存过程中发生错误,通过 catch 处理错误。

注意事项

  • 确保在实际应用中正确处理所有可能的错误情况。
  • 可以根据实际需求调整更新的字段。
  • 这个示例假设你已经连接了 MongoDB 数据库,并且已经初始化了 Mongoose。

希望这个示例能帮助你解决问题!如果有任何进一步的问题,请随时提出。

回到顶部