MongoDB:将元素添加到一个数组,该数组的对象包含在另一个字段上计算的字段

MongoDB: add element to an array with an object that contains field calculated on another field

我有这个文件:

{
    "_id" : ObjectId("626c0440e1b4f9bb5568f542"),
    "bc" : [ 
        {
            "bc_id" : ObjectId("000000000000000000000003"),
            "price" : 102
        }
    ],
    "stock_price" : 50
}

我需要向 bc 数组添加一个元素,该元素的价格是根据 stock_price 计算得出的值。 我试过这样的事情:

db.collection.updateMany(
    {_id:ObjectId("626c0440e1b4f9bb5568f542")},
    [
        {$addToSet: {bc: {bc_id:ObjectId("000000000000000000000004"), price:{$multiply:[{$toDouble:"$stock_price"},0.80]}}}}
    ]
)

$addToSet 在聚合管道中无效。 预期结果是:

{
    "_id" : ObjectId("626c0440e1b4f9bb5568f542"),
    "bc" : [ 
        {
            "bc_id" : ObjectId("000000000000000000000003"),
            "price" : 102
        },
        {
            "bc_id" : ObjectId("000000000000000000000004"),
            "price" : 40
        }
    ],
    "stock_price" : 50
}

查询

  • 您可以使用管道更新来引用 stock_price 字段
  • 通过 _id
  • 查找
  • 如果 "$bc.bc_id" 数组包含新的 bc_id(此处 newid=3)什么也不做,保留旧的 bc,否则压入最后(concat 数组)

Playmongo

update(
{"_id": {"$eq": ObjectId("626c0440e1b4f9bb5568f542")}},
[{"$set": 
   {"bc": 
     {"$cond": 
       [{"$in": [3, "$bc.bc_id"]}, "$bc",
         {"$concatArrays": 
           ["$bc",
             [{"bc_id": 3, "price": {"$multiply":["$stock_price", 0.8]}}]]}]}}}],
{"multi": true})