MongoDB-更新一个字段或另一个字段
我对MongoDB还很陌生,所以这可能是我的经验不足。我正在尝试执行一个MongoDB-更新一个字段或另一个字段,mongodb,mongodb-query,upsert,Mongodb,Mongodb Query,Upsert,我对MongoDB还很陌生,所以这可能是我的经验不足。我正在尝试执行一个upsert,当找到一条记录时,它将根据多个条件更新多个字段 我收集了以下记录: { 型号ID:“5e68c7eaa0887971ea6ef54c”, 版本ID:999, 时间戳:“1/1/2020”, oldValue:'蓝色', newValue:“红色” } 我试图用一个upsert语句来满足以下条件,以避免多次访问数据库(基于找到与modelId和versionId匹配的文档的查询): 如果新记录的timeStam
upsert
,当找到一条记录时,它将根据多个条件更新多个字段
我收集了以下记录:
{
型号ID:“5e68c7eaa0887971ea6ef54c”,
版本ID:999,
时间戳:“1/1/2020”,
oldValue:'蓝色',
newValue:“红色”
}
我试图用一个upsert
语句来满足以下条件,以避免多次访问数据库(基于找到与modelId
和versionId
匹配的文档的查询):
timeStamp
在现有文档之前(lt
),则更新oldValue
timeStamp
位于现有文档之后(gt
),则更新newValue
upsert
语句来实现这一点:
existingRecord=集合中与modelId和versionId匹配的项
if(existingRecord=null)
{
//插入新记录
}
if(newRecord.timeStampexistingRecord.timeStamp)
{
existingRecord.newValue=newRecord.newValue
existingRecord.timeStamp=newRecord.timeStamp
}
我已经看到了根据日期条件执行向上插入的可能性,例如:
db.collection.update( { id:o.id, date: { $lt:o.date } }, {$set : { o }}, {upsert:true} );
我不知道如何扩展它,以便能够根据时间戳
值更新旧值
或新值
我计划每天在集合中插入大量的记录,估计大约1毫米,我不想对每个记录执行find()
,然后执行update()
我正在使用Mongo4.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版中,添加了允许聚合的管道
并且,它只包含以下聚合阶段:
$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"
]
}
}
}
]
)
在版本4.0中,不允许在更新查询中使用条件。因此,您最终会触发两个查询
db.collection.update({condition}, { $set: { o } }, { multi: true ,upsert:true });
db.collection.update({!condition}, { $set: { n } }, { multi: true ,upsert:true });
但是,在4.2版中,添加了允许聚合的管道
并且,它只包含以下聚合阶段:
$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"
]
}
}
}
]
)
感谢大家的提醒,我确实看到了聚合选项,因此我可能可以升级到4.2,但是当查看聚合时,我不确定如何在一个语句中同时满足这两个条件。您是否知道任何使用聚合的示例,这些聚合有2个条件,每个条件都有其on$set?Hi@ODotN,我已经更新了答案,并设法在单个查询中执行所有查询。请看一看。)坦克@Vijay-这似乎是一条路要走。我会尝试一下,我确实看到了聚合选项,所以我可能可以升级到4.2,但是当查看聚合时,我不确定如何在一个语句中实现这两个条件。您是否知道任何使用聚合的示例,这些聚合有2个条件,每个条件都有其on$set?Hi@ODotN,我已经更新了答案,并设法在单个查询中执行所有查询。请看一看。)坦克@Vijay-这似乎是一条路要走。我试试看