基于Meteor中嵌套文档自定义id的条件upsert

时间:2014-09-12 21:26:11

标签: javascript mongodb meteor mongodb-query

这不起作用,但希望这个以及满口的一个标题可以解决问题

function addToDB(account_id)
{
    obj = {};
    if (!Accounts.findOne({account_id: account_id})) obj.createdAt = new Date().valueOf();
    obj.account_id = account_id;
    Accounts.upsert({account_id: account_id}, {$set: obj});
}

我需要使用account_id而不是MongoDB对象id,因此它必须是可索引/唯一的。如果是更新,则createdAt不应更改。

更新,因此它在原始环境中有效,但我更倾向于使用正确答案的解决方案。

1 个答案:

答案 0 :(得分:2)

我怀疑在最小化方面支持这一点,但是你总是可以在服务器上实现逻辑并发布方法。但MongoDB提供了一个$setOnInsert运算符,其目的只是将该值应用于“upsert”实际上插入新文档时执行的更新:

Accounts.upsert(
    { "account_id": obj.account_id }, 
    { 
        "$setOnInsert": { "created_at": new Date() },
        "$set": obj // account_id would be automatically added but it doesn't matter
    }

);

当然假设obj尚未包含a created_at字段,并且您想要的数据实际上是BSON“日期”类型而不是纪元时间戳(BSON日期实际存储为纪元时间戳内部无论如何)否则使用.valueOf()进行转换,如示例所示。