[英]MongoDB - Update One Field or Another
我对 MongoDB 很陌生,所以这可能是我对它的缺乏经验。 我正在尝试做一个upsert
,当找到一条记录时,它将根据多个条件更新多个字段。
我在一个集合中有以下记录:
{
modelId: "5e68c7eaa0887971ea6ef54c",
versionId: 999,
timeStamp: "1/1/2020",
oldValue: 'Blue',
newValue: 'Red'
}
我正在尝试使用单个upsert
语句来满足以下条件,以避免多次访问数据库(基于找到与modelId
和versionId
匹配的文档的查询:
timeStamp
在 ( lt
) 现有文档之前,则更新oldValue
timeStamp
在( gt
)现有文档之后,则更新newValue
在伪代码术语中,我试图用upsert
语句来做到这一点:
existingRecord = item in collection matching modelId and versionId
if(existingRecord = null)
{
//insert newRecord
}
if(newRecord.timeStamp < existingRecord.timeStamp)
{
existingRecord.oldValue = newRecord.oldValue
existingRecord.timeStamp = newRecord.timeStamp
}
else if(newRecord.timeStamp > existingRecord.timeStamp)
{
existingRecord.newValue = newRecord.newValue
existingRecord.timeStamp = newRecord.timeStamp
}
我已经看到了根据日期条件进行upsert
的可能性,例如:
db.collection.update( { id:o.id, date: { $lt:o.date } }, {$set : { o }}, {upsert:true} );
我不知道如何扩展它以便能够根据timeStamp
值更新oldValue
或newValue
。
我计划每天将大量记录插入集合中,估计大约 1MM,我不想为每条记录执行find()
和update()
。
我正在使用 Mongo 4.0,不胜感激。
谢谢!
好吧,在4.0 版本中,您不能在更新查询中使用条件。 因此,您最终会触发两个查询。
db.collection.update({condition}, { $set: { o } }, { multi: true ,upsert:true });
db.collection.update({!condition}, { $set: { n } }, { multi: true ,upsert:true });
但是,在4.2 版本中,添加了允许聚合的db.collection.update管道。
而且,它仅包含以下聚合阶段:
$addFields and its alias $set
$project and its alias $unset
$replaceRoot and its alias $replaceWith.
希望这会有所帮助:)
更新
我添加了$set
阶段来更新文档。 如果时间戳条件为真,它将更新,否则不会更新。 并适用于其他条件。
我已经使用了可以根据您的情况使用的时间戳的长值。
db.collection.update(
{
modelId: "5e68c7eaa0887971ea6ef54c",
versionId: 999,
},
[
{
$set:{
"oldValue":{
$cond:[
{
$lt:[
"timestamp",
1598598257000
]
},
"green",
"$oldValue"
]
}
}
},
{
$set:{
"newValue":{
$cond:[
{
$gt:[
"timestamp",
1518598257000
]
},
"pink",
"$newValue"
]
}
}
}
]
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.