我只是在搜索相当于 SQL 的 MongoDB 时遇到了这个问题:
update t
set c1 = c2
where ...
Sergio 是正确的,您不能在直接更新中引用另一个属性作为值。但是,db.c.find(...)
返回一个游标,并且该游标有一个forEach
方法:
对 MongoDB 的查询返回一个游标,可以对其进行迭代以检索结果。查询的确切方式因语言驱动程序而异。下面的详细信息侧重于来自 MongoDB shell(即
mongo
进程)的查询。
shellfind()
方法返回一个游标对象,然后我们可以对其进行迭代以从结果中检索特定文档。我们
为此目的使用hasNext()
和方法。next()
for( var c = db.parts.find(); c.hasNext(); ) {
print( c.next());
}
此外,在 shell 中,forEach()
可以与游标一起使用:
db.users.find().forEach( function(u) { print("user: " + u.name); } );
所以你可以这样说:
db.QUESTIONS.find({}, {_id: true, i_up: true, i_down: true}).forEach(function(q) {
db.QUESTIONS.update(
{ _id: q._id },
{ $set: { i_pp: q.i_up * 100 - q.i_down * 20 } }
);
});
在不离开 MongoDB 的情况下一次更新它们。
如果您使用驱动程序连接到 MongoDB,那么应该有某种方法可以将 JavaScript 字符串发送到 MongoDB;例如,使用您要使用的 Ruby 驱动程序eval
:
connection.eval(%q{
db.QUESTIONS.find({}, {_id: true, i_up: true, i_down: true}).forEach(function(q) {
db.QUESTIONS.update(
{ _id: q._id },
{ $set: { i_pp: q.i_up * 100 - q.i_down * 20 } }
);
});
})
其他语言应该类似。