Nodejs中在 MongoDB 如何原子地增加一个 ISODate 类型的值
Nodejs中在 MongoDB 如何原子地增加一个 ISODate 类型的值
直接使用 $inc 似乎不可以:
{$inc: {"time": 1}}
错误:
Cannot apply $inc modifier to non-number
4 回复
在 Node.js 中操作 MongoDB 时,如果你想要原子地增加一个 ISODate
类型的值,你不能直接使用 $inc
操作符,因为 $inc
只能用于数值类型。对于 ISODate
类型的操作,你需要使用 $set
操作符来设置一个新的日期值。
以下是一个示例代码,展示了如何在 MongoDB 中原子地增加一个 ISODate
类型的值:
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
// 定义一个简单的模式
const itemSchema = new Schema({
name: String,
lastUpdated: { type: Date, default: Date.now }
});
const Item = mongoose.model('Item', itemSchema);
async function updateLastUpdated() {
try {
// 连接到 MongoDB
await mongoose.connect('mongodb://localhost:27017/testdb', {
useNewUrlParser: true,
useUnifiedTopology: true
});
// 查找文档
const item = await Item.findOne({ name: 'example' });
if (!item) {
console.log('Document not found');
return;
}
// 使用 $set 设置新的 ISODate 值
const result = await Item.updateOne(
{ _id: item._id },
{ $set: { lastUpdated: new Date() } }
);
console.log(`Updated ${result.modifiedCount} document(s)`);
} catch (error) {
console.error('Error updating document:', error);
} finally {
// 关闭连接
mongoose.disconnect();
}
}
updateLastUpdated();
解释
-
定义模式:
- 我们定义了一个简单的 Mongoose 模式
itemSchema
,其中包含一个名为lastUpdated
的字段,类型为Date
,默认值为当前时间。
- 我们定义了一个简单的 Mongoose 模式
-
连接到 MongoDB:
- 使用
mongoose.connect
方法连接到 MongoDB 数据库。
- 使用
-
查找文档:
- 使用
Item.findOne
查找满足条件的文档。如果文档不存在,则输出 “Document not found” 并返回。
- 使用
-
更新文档:
- 使用
Item.updateOne
更新文档。我们使用$set
操作符将lastUpdated
字段设置为当前时间的新ISODate
值。
- 使用
-
关闭连接:
- 最后,无论成功与否,都会关闭与 MongoDB 的连接。
通过这种方式,你可以原子地更新 ISODate
类型的字段。
存timestamp。
嗯嗯,不过不懂 mongo 支持不支持 timestamp。
如果用 isodate 的话,话说好像没有什么数据库会提供对于时间类型的增减操作支持。
在 Node.js 中操作 MongoDB 时,如果你想要原子地增加一个 ISODate
类型的值,直接使用 $inc
是不行的,因为 $inc
只能用于数值类型。你可以通过更新文档来实现这一需求,具体方法是使用 $set
操作符结合当前时间。
以下是一个示例代码,展示了如何在 Node.js 中使用 Mongoose 库来实现这一功能:
const mongoose = require('mongoose');
// 假设我们有一个简单的 Schema 定义
const schema = new mongoose.Schema({
name: String,
time: { type: Date, default: Date.now }
});
const MyModel = mongoose.model('MyModel', schema);
async function updateIsoDate() {
try {
// 找到文档并原子地更新 time 字段
const result = await MyModel.findOneAndUpdate(
{ name: 'someName' }, // 查询条件
{
$set: {
time: new Date()
}
},
{
new: true, // 返回更新后的文档
upsert: true // 如果没有找到匹配的文档,则插入新文档
}
);
console.log(result);
} catch (error) {
console.error(error);
}
}
updateIsoDate();
在这个例子中,我们使用了 findOneAndUpdate
方法,它允许我们找到一个文档并更新它。通过 $set
操作符,我们可以设置 time
字段为当前时间。这样就可以保证操作的原子性。