【求助】Nodejs中mongodb无法改变查找到的doc属性
【求助】Nodejs中mongodb无法改变查找到的doc属性
如图,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);
解释
- 查询文档:使用
find
方法查询到一个或多个文档。 - 修改文档:对查询到的文档进行修改,例如修改
create_at
属性。 - 保存更改:调用
.save()
方法将修改后的文档保存回数据库。
注意:
find
方法返回的是一个数组,即使只查询到一条记录。- 直接修改数组中的文档对象不会自动保存到数据库,必须调用
.save()
方法。
通过上述步骤,你应该能够成功地修改并保存 MongoDB 中的文档属性。
修改之后要save一下
恩 查了下mongoose文档 toObject()
一下就好了
根据你的描述,问题可能在于你尝试修改的文档对象没有被正确保存回数据库。MongoDB 中的查询结果是只读的,除非你显式地使用更新操作来修改数据并保存。
以下是一些常见的原因及解决方法:
-
确保你在修改后调用了
save()
或者updateOne()
方法:- 如果你使用的是 Mongoose 库,可以调用
save()
方法保存更改。 - 如果你直接使用 MongoDB 驱动程序,则需要调用
updateOne()
或类似的方法来更新数据库中的文档。
- 如果你使用的是 Mongoose 库,可以调用
-
检查是否有事务在进行:
- 如果你在事务中进行更新操作,确保事务已经提交。
-
确保使用了正确的查询条件:
- 确保你的查询条件能够匹配到要更新的文档。
示例代码
假设你使用的是 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()
方法将修改后的数据保存回数据库。 - 确保你查询到的文档确实是你要修改的那个,并且修改后调用了保存方法。
希望这些信息对你有所帮助!如果还有其他问题,请继续咨询。