Nodejs mongoose $unset 删除某属性

Nodejs mongoose $unset 删除某属性

某文档的属性为

var ComSchema = new Schema({
	name : String ,
    icon_s : String ,
    icon_l : String ,
    number : Number ,
    illustrations :[ String]
});	

生成的文档为

{
name:"chat",
icon_s:"",
icon_l:"",
number:20,
illustrations:[]
}

如果想删除 icon_lnumberillustrations 属性

执行的操作

Com.update({name:"chat"},{$unset:{icon_l:1,number:1,illustrations:1}},function(err){
});

发现执行成功后,属性并没有被删除,请问该如何正确操作?


3 回复

要使用 Mongoose 和 MongoDB 的 $unset 操作符来删除某个属性,你需要确保你的查询和更新操作都正确无误。在你的例子中,你想要删除 icon_lnumberillustrations 属性。

示例代码

首先,我们需要定义一个 Mongoose 模型,并且创建一个文档。然后,我们使用 $unset 操作符来删除指定的属性。

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

// 定义 Schema
const ComSchema = new Schema({
    name: String,
    icon_s: String,
    icon_l: String,
    number: Number,
    illustrations: [String]
});

// 创建模型
const Com = mongoose.model('Com', ComSchema);

// 连接到 MongoDB 数据库
mongoose.connect('mongodb://localhost:27017/testdb', { useNewUrlParser: true, useUnifiedTopology: true })
    .then(() => console.log("MongoDB Connected"))
    .catch(err => console.error("MongoDB Connection Error:", err));

// 创建一个示例文档
const createDocument = async () => {
    const doc = new Com({
        name: "chat",
        icon_s: "",
        icon_l: "",
        number: 20,
        illustrations: []
    });

    await doc.save();
    console.log("Document created:", doc);
};

createDocument();

// 删除属性
const deleteProperties = async () => {
    try {
        await Com.updateOne(
            { name: "chat" }, // 查询条件
            { $unset: { icon_l: 1, number: 1, illustrations: 1 } } // 更新操作
        );
        console.log("Properties deleted successfully");
    } catch (err) {
        console.error("Error deleting properties:", err);
    }
};

deleteProperties();

解释

  1. 定义 Schema:首先定义一个 Mongoose Schema,描述文档的结构。
  2. 创建模型:使用定义的 Schema 创建一个 Mongoose 模型。
  3. 连接数据库:连接到 MongoDB 数据库。
  4. 创建文档:创建并保存一个示例文档。
  5. 删除属性:使用 updateOne 方法,传入查询条件 { name: "chat" } 和更新操作 { $unset: { icon_l: 1, number: 1, illustrations: 1 } }

注意事项

  • 使用 $unset 操作符时,只需传入字段名即可,不需要传入值(如 1)。
  • 确保查询条件能够准确匹配到你要更新的文档。
  • 使用 updateOne 而不是 update,以避免不必要的警告信息。

这样,你应该能够正确地删除指定的属性。


是否有报错在 err 里?

在使用 Mongoose 的 $unset 操作符删除某个属性时,如果想要完全删除该属性而不是将其值设为 nullundefined,你需要确保操作是正确的。根据你的描述,操作本身看起来没有问题,但可能需要确认一些细节。

示例代码

假设你有一个模型定义如下:

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

const ComSchema = new Schema({
    name: String,
    icon_s: String,
    icon_l: String,
    number: Number,
    illustrations: [String]
});

const Com = mongoose.model('Com', ComSchema);

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

async function unsetFields() {
    try {
        // 找到文档并执行 $unset 操作
        await Com.updateOne(
            { name: "chat" },
            { $unset: { icon_l: "", number: "", illustrations: "" } }
        );

        console.log("字段已成功删除");
    } catch (err) {
        console.error("更新失败", err);
    }
}

unsetFields();

关键点解释

  1. 使用 $unset 操作符

    • $unset 会将指定的字段从文档中移除。
    • 在你的例子中,{ $unset: { icon_l: "", number: "", illustrations: "" } } 是正确的语法。
  2. updateOne vs update 方法

    • 使用 updateOne 更符合现代 Mongoose API 的推荐用法。
    • update 方法仍然可用,但在较新版本的 Mongoose 中,推荐使用 updateOne
  3. 确保文档存在

    • 确保要更新的文档确实存在于数据库中,否则更新操作不会执行。
  4. 错误处理

    • 始终检查错误,以确保操作成功或了解操作失败的原因。

注意事项

  • 确认 name: "chat" 的条件能找到对应的文档。
  • 如果文档不存在,$unset 不会抛出错误,但它也不会有任何效果。
  • 确认 MongoDB 和 Mongoose 的版本兼容性,避免潜在的 API 变更带来的问题。

通过以上步骤,你应该能够成功地使用 $unset 删除文档中的属性。

回到顶部