[英]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_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.