Nodejs 求一mongodb的插入语句($addToSet)

Nodejs 求一mongodb的插入语句($addToSet)

如果结构如下: new Schema({ memberId: ObjectId, categories: [{name: String, type: String}] })

现在要给memberId为xxx的插入一条数据,但如果name与type已经存在时,则不插入。 例: 数据库的categories已经存在一条记录,{name: 'default', type = 'in'},这时候插入一条{name: 'default', type: 'out'},是可以插入的,因为type不一致,但如果插入一条{name: 'default', type: 'in'}应该无法插入,因为{name: 'default', type = 'in'}已经存在。

求写法,谢谢


4 回复

当然可以。根据你的需求,你需要使用 MongoDB 的 $addToSet 操作符来确保只有在指定条件不满足时才插入新的数组元素。下面是一个具体的 Node.js 示例代码,展示如何实现这一点。

首先,我们需要安装并设置好 MongoDB 驱动程序。如果你还没有安装 mongoose,可以通过以下命令进行安装:

npm install mongoose

接下来,我们创建一个简单的 Mongoose 模型,并编写一个函数来处理插入逻辑:

const mongoose = require('mongoose');

// 定义 Schema
const schema = new mongoose.Schema({
    memberId: { type: mongoose.Schema.Types.ObjectId },
    categories: [
        {
            name: { type: String },
            type: { type: String }
        }
    ]
});

// 创建模型
const MemberModel = mongoose.model('Member', schema);

async function insertCategory(memberId, categoryName, categoryType) {
    try {
        // 使用 findOneAndUpdate 更新文档
        const result = await MemberModel.findOneAndUpdate(
            { _id: memberId }, // 查询条件
            {
                $addToSet: {
                    categories: {
                        name: categoryName,
                        type: categoryType
                    }
                }
            },
            { new: true } // 返回更新后的文档
        );

        console.log(result);
    } catch (error) {
        console.error(error);
    }
}

// 示例调用
insertCategory('your-member-id-here', 'default', 'out');

解释

  1. 定义 Schema:我们定义了一个包含 memberIdcategories 字段的 Schema。categories 是一个数组,每个元素都是一个对象,包含 nametype 字段。

  2. 创建模型:我们使用定义的 Schema 创建了一个名为 Member 的模型。

  3. insertCategory 函数:该函数接收 memberIdcategoryNamecategoryType 作为参数。我们使用 findOneAndUpdate 方法查询并更新指定的文档。$addToSet 操作符确保只有当数组中不存在相同 nametype 组合时,才会添加新的数组元素。

  4. 示例调用:最后,我们通过调用 insertCategory 函数来插入一个新的类别。

这样,你就可以确保只有当指定的 nametype 组合不存在时,新的数组元素才会被插入到 categories 数组中。


xxxSchema.pre(‘save’, function(next){ …checkLogic… })

collection.update({“Guid”:Guid},{$set:{“imageCode”:imageCode,“date”:date}},{upsert:true},function(err) { if(err) { logger.error(“imageCode:”+imageCode+“date:”+date+" "+err); } else {

}

});

参考我这个吧,主要是upsert这个设置。如果存在则更新,不存在则添加。

为了实现这个需求,可以使用 MongoDB 的 $addToSet 操作符。$addToSet 会在数组中添加一个新元素,前提是该元素不在数组中已存在。下面是如何使用 Node.js 和 Mongoose 实现这一点:

示例代码

首先确保你已经安装了 mongoosemongodb

npm install mongoose mongodb

然后你可以编写如下代码来插入新的分类项,只有当该分类不存在时才会被添加到数据库中:

const mongoose = require('mongoose');

// 连接 MongoDB 数据库
mongoose.connect('mongodb://localhost:27017/your_database', { useNewUrlParser: true, useUnifiedTopology: true });

// 定义模型
const schema = new mongoose.Schema({
    memberId: { type: mongoose.Schema.Types.ObjectId },
    categories: [{ name: String, type: String }]
});

const MyModel = mongoose.model('MyModel', schema);

async function addCategory(memberId, categoryName, categoryType) {
    try {
        // 使用 $addToSet 确保只有当元素不存在时才添加
        await MyModel.updateOne(
            { _id: memberId }, // 查询条件
            { $addToSet: { categories: { name: categoryName, type: categoryType } } }
        );

        console.log("Category added successfully!");
    } catch (error) {
        console.error("Error adding category:", error);
    }
}

// 调用函数
addCategory('some-member-id', 'default', 'out');

解释

  • updateOne 方法用于更新数据库中的文档。
  • 第一个参数是查询条件,这里我们根据 memberId 来查找文档。
  • 第二个参数是更新操作,使用 $addToSet 来确保只有当指定的分类(基于 nametype)不存在于 categories 数组中时,才会将新分类添加进去。

通过这种方式,你可以确保只有当分类项不存在时才会被添加,从而避免重复的数据。

回到顶部