如何通过乘以字段值Mongodb来更新Field

时间:2016-01-03 14:39:44

标签: javascript mongodb nosql

我尝试用欧元值更新字段,但出现了问题。

db.orders.update({
    "_id": ObjectId("56892f6065380a21019dc810")
}, {
    $set: {
        "wartoscEUR": {
            $multiply: ["wartoscPLN", 4]
        }
    }
})

我收到了一个错误:

  

美元($)前缀字段&$ 39; $ multiply'在' wartoscEUR。$ multiply'对存储无效。

WartoscPLN和WartoscEUR是数字字段,我想通过将wartoscPLN乘以4来计算wartoscEUR。

很抱歉,也许这很容易,但我刚刚开始使用nosql。

2 个答案:

答案 0 :(得分:0)

$ multiply-operator仅用于聚合。您正在寻找的运算符是$mul,它的语法不同:

db.orders.update(
    {"_id" : ObjectId("56892f6065380a21019dc810")},
    { $mul: { wartoscPLN: 4 }
);

没有必要将它与$ set结合起来,因为它暗含了隐含的语义。

答案 1 :(得分:0)

$multiply 运算符只能在聚合框架中使用,而不能在更新操作中使用。您可以使用案例中的 aggregation framework 来创建新结果集,其中包含使用 $project 创建的新字段wartoscEUR管道。

然后,您可以在结果集中循环显示(使用 forEach() 方法返回的光标的 .aggregate() 方法),使用新值更新您的集合,但您无法直接在update语句中访问文档的值,因此Bulk API更新操作在此处派上用场:

批量更新至少允许在单个请求中使用单一响应发送许多操作。

上述操作可以用这种实现来描述:

var bulk = db.orders.initializeOrderedBulkOp(),
    counter = 0;

db.orders.aggregate([
    {
        "$project": {                
            "wartoscEUR": { "$multiply": ["$wartoscPLN", 4] }
        }
    }
]).forEach(function (doc) {
    bulk.find({ "_id": doc._id }).updateOne({
        "$set": { "wartoscEUR": doc.wartoscEUR }
    });

    counter++;

    if (counter % 1000 == 0) {
        bulk.execute();
        bulk = db.orders.initializeOrderedBulkOp();
    }
});

if (counter % 1000 != 0) {
    bulk.execute();
}