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();

解释

  1. 定义模式

    • 我们定义了一个简单的 Mongoose 模式 itemSchema,其中包含一个名为 lastUpdated 的字段,类型为 Date,默认值为当前时间。
  2. 连接到 MongoDB

    • 使用 mongoose.connect 方法连接到 MongoDB 数据库。
  3. 查找文档

    • 使用 Item.findOne 查找满足条件的文档。如果文档不存在,则输出 “Document not found” 并返回。
  4. 更新文档

    • 使用 Item.updateOne 更新文档。我们使用 $set 操作符将 lastUpdated 字段设置为当前时间的新 ISODate 值。
  5. 关闭连接

    • 最后,无论成功与否,都会关闭与 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 字段为当前时间。这样就可以保证操作的原子性。

回到顶部