使用$ set和$ currentDate更新文档时发生冲突

时间:2018-04-11 15:15:29

标签: node.js mongodb

我正在使用Mongo 3.6.3,我有一个包含集合的数据库和_id等于1的项目。

我想通过在该对象的内添加一个对象和时间戳来更新该项。但是,我收到一个错误。这是我的所作所为:

function MyObject() {
    this.bar = {
        apples: 4,
        bananas: 5
    };
}

collection.update({
    _id: 1
}, {
    $set: {
        "foo": new MyObject()
    },
    $currentDate: {
        "foo.time": {
            $type: 'timestamp'
        }
    }
}, function (err) {
    console.log(err.name, err.message);
});

我得到了:

  

MongoError更新路径'foo.time'会在'foo'

处产生冲突

为什么会这样?

如果我先运行$set操作,然后再运行$currentDate另一个update(),我会得到所需的结果:

{
    "_id" : 1,
    "foo" : {
        "bar" : {
            "apples" : 4,
            "bananas" : 5
        },
        "time" : Timestamp(1523459420, 1)
    }
}

但是,如果我尝试同时执行它们,就像我在上面的代码中显示的那样,我就会收到错误。的为什么吗

1 个答案:

答案 0 :(得分:2)

您不能让多个运算符($set$currentDate)修改相同的路径(在这种情况下为foo)。在您的情况下,您可以使用点表示法:

collection.update({
    _id: 1
}, {
    $set: {
        "foo.bar.apples": 4,
        "foo.bar.bananas": 5
    },
    $currentDate: {
        "foo.time": {
            $type: 'timestamp'
        }
    }
}, function (err) {
    console.log(err.name, err.message);
});

或只是更改MyObject以设置this.time = new Date(),而不是使用$currentDate