我尝试用欧元值更新字段,但出现了问题。
db.orders.update({
"_id": ObjectId("56892f6065380a21019dc810")
}, {
$set: {
"wartoscEUR": {
$multiply: ["wartoscPLN", 4]
}
}
})
我收到了一个错误:
美元($)前缀字段&$ 39; $ multiply'在' wartoscEUR。$ multiply'对存储无效。
WartoscPLN和WartoscEUR是数字字段,我想通过将wartoscPLN乘以4来计算wartoscEUR。
很抱歉,也许这很容易,但我刚刚开始使用nosql。
答案 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();
}