繁体   English   中英

根据 object 中的值更新 MongoDB 集合

[英]Update MongoDB collection based on values from an object

我有一个 MongoDB 集合,如下所示:

[
  {
    "stock": "GOOGLE",
    "price": 0
  },
  {
    "stock": "FACEBOOK",
    "price": 0
  }
]

我有一个Stock_Prices object像这样:

{
  "GOOGLE": {
    "price": 31.35
  },
  "FACEBOOK": {
    "price": 10.75
  }
}

我需要使用 Node.js 从Stock_Prices object 更新集合中的每只股票。

我想到了以下方法:

  • 遍历集合文档
  • 对于每个文档,获取“stock”字段值(GOOGLE、FACEBOOK)
  • Stock_Prices[document.stock].price中提取价格
  • 更新文档

这是一种不可接受的方法,因为我有成千上万的记录,并且需要立即更新。

更新:没有必要,它应该是一个更新操作——如果它是一个查找,那么我相信它也会做这个工作

我该怎么做?

您必须使用object并将其转换为数组并将其传递给聚合管道。

const stocksMap = {
  "GOOGLE": {
    "price": 31.35
  },
  "FACEBOOK": {
    "price": 10.75
  }
}

const stocks = Object.entries(stocksMap).map(([stock, price]) => ({ stock, price : price.price }))

/* You will get something like this
[{
  "stock": "GOOGLE",
  "price": 31.35
}, {
  "stock": "FACEBOOK",
  "price": 10.75
}]
*/

/* If you want to just read the data, without updating */

db.stocks.aggregate([
  {
    $set: {
      price: {
        $reduce: {
          input: stocks,
          initialValue: 0,
          in: {
            $cond: [
              { $eq: ["$$this.stock", "$stock"] },
              "$$this.price",
              "$$value"
            ]
          }
        }
      }
    }
  }
])

/* If you want to update the existing data, you can use the same pipeline in an aggregation (available from v4.2) */

db.stocks.update({}, [
  {
    $set: {
      price: {
        $reduce: {
          input: stocks,
          initialValue: 0,
          in: {
            $cond: [
              { $eq: ["$$this.stock", "$stock"] },
              "$$this.price",
              "$$value"
            ]
          }
        }
      }
    }
  }
])

如果您不想更新文档,您可以将stocks放在另一个集合中并改用$lookup 那应该更高效。

我将从帖子中取出一份 object 并展示如何更新:

var stock_price =  { "GOOGLE": { "price": 31.35 } }  // this is the input

var stock_price_doc = Object.keys(stock_price).map (k => ( {field: k, value: stock_price[k] } ) )[0]

stock_price_doc现在有这个值: { "field": "GOOGLE", "value": { "price": 31.35 } }

集合的文档(来自帖子):

{
    "stock": "GOOGLE",
    "price": 0
}

更新操作:

db.stocks.update(
  { stock: stock_price_doc.field },
  { $set: { price: stock_price_doc.value.price } }
)

更新后的文件(结果):

{ "stock" : "GOOGLE", "price" : 31.35 }

如果更新是增加股票价格,而不是设置值,请使用:

{ $inc: { price: stock_price_doc.value.price } }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM