我想更新一个数组并返回文档.我的findAndModify语法是否正确?
this.becomeFollower = function(title, username, callback){
"use strict"
posts.findAndModify({
query: {"title":title, "roster":"yes"},
update: { "$addToSet": { "followers":username } },
new: true,
upsert: true
},
function(err, doc){
console.log('find and modified ' +doc);
});
}
Run Code Online (Sandbox Code Playgroud)
使用它我没有问题:
posts.update({"title":title, "roster":"yes"}, { "$addToSet": { "followers":username } }, function(err, roster){
"use strict"
if(err) return callback(err, null);
callback(err, roster);
});
Run Code Online (Sandbox Code Playgroud) 假设有如下文档的结构:
{_id:"session-01", status:"free"}
并且有两个并发操作执行以下findAndModify
操作:
db.collection.findAndModify({query:{status:"free"}, update:{status:"occupied"}, new:true})
我想要实现的只有一个操作可以获得"空闲"操作,并对其执行锁定,因此其他操作必须为空.那是findAndModify的作用吗?
例如,我如何选择 5 行代码,并将所有实例替换myObject1
为myObject2
?
如果后续代码行包含我不希望更改的myObject1
引用。这样我就可以非常方便地在此代码范围内快速应用查找和替换,而不必担心副作用。
这可能吗?
我想要这样的东西:
old_record
new_record
old_record
我写这样的代码:
ret = nil
// First, Find the obj
obj := &orm.QuerySetObj{}
err2 := this.querySetCollection.With(session).Find(objKey).One(obj)
if nil != err2 {
this.logger.Println("Error find obj")
return
}
ret = obj
// Then, update this obj
obj.updateTime = time.Now().Unix()
err3 := this.querySetCollection.With(session).Upsert(objKey, obj)
if nil != err3 {
this.logger.Println("Error update obj")
return
}
return
Run Code Online (Sandbox Code Playgroud)
但是,我想find
和update
应该是一个atomic
操作,所以我的代码是不是安全.
我怎么能在原子操作中做到这一点
我想创建一个从 1000 开始的计数器。
即upsert一个mongodb文档如下
以下不起作用:
environment_data:PRIMARY> db.test.findAndModify
({query:{key:"mycounter"},
update:{$inc:{value:1}, $set:{value:1000}},
upsert:true})
Error: findAndModifyFailed failed: {
"errmsg" : "exception: Cannot update 'value' and 'value' at the same time",
"code" : 16836,
"ok" : 0
}
Run Code Online (Sandbox Code Playgroud)
有没有办法告诉 upsert 对于插入,它需要 $set 1000 ,但对于更新,它需要 $inc 1 ?
我目前在 Spring boot 中使用 mongoTemplate,如下所示:
public MyEntity update(MyDto dto) {
...
MyEntity result = mongoTemplate.findAndModify(
query, update, MyEntity.class);
return result;
}
Run Code Online (Sandbox Code Playgroud)
query
放入找到Criteria
要MyEntity
修改的 ,并update
放入要更改的内容。但返回的值是更新前的数据。如何立即获取修改后的值?
我正在使用Update和FindAndModify但现在我已经读过Update和FindAndModify是原子的(http://docs.mongodb.org/manual/tutorial/model-data-for-atomic-operations/),
因此,如果两者都可以完成相同的工作,通过查询项目并更新它,那么有什么区别?
我在StackOverflow上找到了几个答案,但没有一个提到Update也是原子的:在MongoDB中findAndModify和update有什么区别?
我知道,mongo DB 上没有事务支持。但是现在我需要读取文档的值,增加 1 并写入新值。
或者 - 不同的方式:更新一个元素并同时读取值。为此,我喜欢使用查找和修改:http : //www.mongodb.org/display/DOCS/findAndModify+Command
此命令更新文档并返回更新前的值。这是否发生在(相同的)交易中?关键是:另一个会话是否有可能在另一个会话的两个步骤之间更新相同的值?
(对不起,对我来说很难解释 - 我希望你明白我想说的话)
谢谢你。
我想使用 findAndModify 更新插入嵌入文档的字段。例如,如果我要插入这个文档。
{
'name':'Goku',
'level':9000,
'family':{
'son':'Grandpa Gohan',
'wife':'Chi Chi'
}
}
Run Code Online (Sandbox Code Playgroud)
然后稍后插入以下文档:
{
'name':'Goku',
'type':'Super Saiyan',
'family':{
'son':'Gohan',
'father':'Bardock'
}
}
Run Code Online (Sandbox Code Playgroud)
期望的最终结果是:
{
'name':'Goku',
'level':9000,
'type':'Super Saiyan',
'family':{
'son':'Gohan',
'father':'Bardock',
'wife':'Chi Chi'
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试用下面的代码在 Java 中实现这一点,但没有成功。是否有任何内置功能可以实现上述预期结果?
String json = "{'name':'Goku', 'level':9000, 'family':{'son':'Grandpa Gohan', 'wife':'Chi Chi'} }";
DBObject document = (DBObject) JSON.parse(json);
BasicDBObject update = new BasicDBObject("$set", document);
BasicDBObject query = new BasicDBObject().append("name", document.get("name"));
collection.findAndModify(query, null, null, false, update, false, true);
json = "{'name':'Goku', 'type':'Super Saiyan', 'family':{'son':'Gohan', 'father':'Bardock'} …
Run Code Online (Sandbox Code Playgroud) 我的MongoDB 中具有类似以下文档的Collection 上下文(上下文中有一些具有角色的用户)
{
"__v" : 0,
"_id" : ObjectId("53dea71a713d636e1fea705a"),
"name" : "team4",
"users" : [
{
"userId" : "53a347467f311d7c1731f91b",
"roles" : [
"admin"
]
},
{
"userId" : "536d2e8be0f9697e13b95c87",
"roles" : []
}
]
}
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以使用findAndModify向用户添加(或删除)角色。
输入:
0 77 1 2 3 5
0 78 2 4 6 1
0 78 1 2 3 5
3 79 0 4 5 2
3 79 6 8 2 1
3 79 1 2 3 1
Run Code Online (Sandbox Code Playgroud)
输出:(为相同的行添加第3列值并取第4列,第5列和第6列中的所有值的平均值)
0 77 1.0 2.0 3.0 5.0
0 78 3.0 3.0 4.5 3.0
3 79 7.0 4.6 3.3 1.3
Run Code Online (Sandbox Code Playgroud) findandmodify ×11
mongodb ×8
atomic ×1
dataframe ×1
go ×1
java ×1
javascript ×1
mongomapper ×1
node.js ×1
python ×1
r ×1
sorting ×1
spring-boot ×1
transactions ×1
upsert ×1