我试图在MongoDB中使用upsert更新文档中的单个字段(如果找到)或插入包含大量字段的整个新文档.问题是我觉得MongoDB要么替换每个字段,要么在其upsert操作中插入一个字段子集,即它不能插入比实际想要更新的字段更多的字段.
我想做的是以下内容:
让我们来说明:
如果找到'name',这个例子将从我的理解更新'lastseen'日期,但如果找不到'name',它只会插入'name'+'lastseen'.
db.somecollection.update({name: "some name"},{ $set: {"lastseen": "2012-12-28"}}, {upsert:true})
Run Code Online (Sandbox Code Playgroud)
如果我向第二个参数添加了更多字段(键/值对)并删除了$ set,那么每个字段都会在更新时被替换,但会对插入产生所需的效果.是否有像插入或类似的东西只在插入时执行操作?
所以在我看来,我只能得到以下之一:
我的理解是否正确?如果是这样,这可以通过一次操作解决吗?
cer*_*ros 32
MongoDB 2.4有 $setOnInsert
db.somecollection.update(
{name: "some name"},
{
$set: {
"lastseen": "2012-12-28"
},
$setOnInsert: {
"firstseen": <TIMESTAMP> # set on insert, not on update
}
},
{upsert:true}
)
Run Code Online (Sandbox Code Playgroud)
有一个功能请求(https://jira.mongodb.org/browse/SERVER-340),已在2.3中解决.奇怪的版本实际上是dev版本所以这将是2.4稳定版.
因此,目前的稳定版本还没有真正做到这一点的方法.恐怕唯一的方法是实际执行3个条件查询atm:1来检查行,然后a if
来插入或更新.
我想如果你在这里遇到锁的真正问题,你可以用单一的JS做这个功能,但这是邪恶的,但它会将这个更新锁定到一个线程.
归档时间: |
|
查看次数: |
16045 次 |
最近记录: |