【求助】Nodejs中mongodb无法改变查找到的doc属性

【求助】Nodejs中mongodb无法改变查找到的doc属性

图1 图2 如图,comments为find找到的doc集合,修改create_at之后打出来竟然是原来的!!我试过在上面增加属性也是无效的! 这是啥情况呢?

4 回复

好的,让我们来分析一下这个问题,并提供一个具体的解决方案。

问题描述

根据你的描述,你使用 find 方法从 MongoDB 中查询到了一个文档(doc),并尝试修改该文档中的某个属性(例如 create_at),但发现修改后的结果并没有保存到数据库中。这通常是因为 MongoDB 的查询操作返回的是文档的副本,而不是原始文档的引用,因此直接修改副本不会影响原始数据。

解决方案

示例代码

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

// 假设我们有一个评论的Schema
const commentSchema = new Schema({
    content: String,
    create_at: Date
});

const Comment = mongoose.model('Comment', commentSchema);

async function updateComment() {
    // 查询到一个评论文档
    let comments = await Comment.find({ /* 条件 */ });

    if (comments.length > 0) {
        // 修改第一个评论的 create_at 属性
        comments[0].create_at = new Date(); // 假设你想更新为当前时间
        
        // 保存修改后的文档
        await comments[0].save();
        
        console.log("Updated document:", comments[0]);
    } else {
        console.log("No documents found.");
    }
}

updateComment().catch(console.error);

解释

  1. 查询文档:使用 find 方法查询到一个或多个文档。
  2. 修改文档:对查询到的文档进行修改,例如修改 create_at 属性。
  3. 保存更改:调用 .save() 方法将修改后的文档保存回数据库。

注意:

  • find 方法返回的是一个数组,即使只查询到一条记录。
  • 直接修改数组中的文档对象不会自动保存到数据库,必须调用 .save() 方法。

通过上述步骤,你应该能够成功地修改并保存 MongoDB 中的文档属性。


修改之后要save一下

恩 查了下mongoose文档 toObject()一下就好了

根据你的描述,问题可能在于你尝试修改的文档对象没有被正确保存回数据库。MongoDB 中的查询结果是只读的,除非你显式地使用更新操作来修改数据并保存。

以下是一些常见的原因及解决方法:

  1. 确保你在修改后调用了 save() 或者 updateOne() 方法

    • 如果你使用的是 Mongoose 库,可以调用 save() 方法保存更改。
    • 如果你直接使用 MongoDB 驱动程序,则需要调用 updateOne() 或类似的方法来更新数据库中的文档。
  2. 检查是否有事务在进行

    • 如果你在事务中进行更新操作,确保事务已经提交。
  3. 确保使用了正确的查询条件

    • 确保你的查询条件能够匹配到要更新的文档。

示例代码

假设你使用的是 Mongoose,可以这样操作:

const mongoose = require('mongoose');
const YourModel = mongoose.model('YourModel', new mongoose.Schema({}));

async function updateDocument() {
    // 查询文档
    const doc = await YourModel.findOne({ _id: 'your-document-id' });

    // 修改属性
    doc.create_at = new Date();  // 修改 create_at 属性

    // 保存更改
    await doc.save();

    console.log(doc);  // 打印修改后的文档
}

updateDocument().catch(console.error);

如果你使用的是原生 MongoDB 驱动程序,可以这样操作:

const { MongoClient } = require('mongodb');

async function updateDocument() {
    const client = new MongoClient('mongodb://localhost:27017', { useNewUrlParser: true, useUnifiedTopology: true });
    await client.connect();
    const db = client.db('your-database-name');
    const collection = db.collection('your-collection-name');

    // 查询文档
    const doc = await collection.findOne({ _id: 'your-document-id' });

    // 修改属性
    doc.create_at = new Date();  // 修改 create_at 属性

    // 更新数据库中的文档
    await collection.updateOne(
        { _id: doc._id },
        { $set: { create_at: doc.create_at } }
    );

    // 重新查询以验证更改
    const updatedDoc = await collection.findOne({ _id: doc._id });
    console.log(updatedDoc);  // 打印修改后的文档

    await client.close();
}

updateDocument().catch(console.error);

解释

  • 使用 doc.save()collection.updateOne() 方法将修改后的数据保存回数据库。
  • 确保你查询到的文档确实是你要修改的那个,并且修改后调用了保存方法。

希望这些信息对你有所帮助!如果还有其他问题,请继续咨询。

回到顶部