我有这样的架构:
doc:
{
//Some fields
visits:
[
{
userID: Int32
time: Int64
}
]
}
我想首先检查特定的userID
是否存在,如果不存在,请推送包含userID
和系统time
的文档,否则只需更新time
值。我知道$push
和$addToSet
都无法做到这一点。同时使用$
与upsert:true
不起作用,因为官方documentation建议说,在尝试插入时,DB将使用$
作为字段名称而不是运算符。
请指导我这件事。感谢
答案 0 :(得分:6)
您可以使用$addToSet
将项目添加到数组中,并$set
更新此数组中的现有项目。
如果在数组中找不到userID
,以下内容会向数组中添加一个新项:
db.doc.update({
visits: {
"$not": {
"$elemMatch": {
"userID": 4
}
}
}
}, {
$addToSet: {
visits: {
"userID": 4,
"time": 1482607614
}
}
}, { multi: true });
如果子文档数组项与userId
匹配,则以下内容将更新它:
db.doc.update({ "visits.userID": 2 }, {
$set: {
"visits.$.time": 1482607614
}
}, { multi: true });