我是MongoDB的新手...我缺少了一个"新手"标签,所以Maven们不会看到这个问题。
我正在尝试使用表达式更新集合中的所有文档。我希望解决此问题的查询是:
db.QUESTIONS.update({}, { $set: { i_pp : i_up * 100 - i_down * 20 } }, false, true);
但是,这会导致以下错误消息:
参考错误:i_up未定义(shell):1
同时,数据库也没有发现吃这一条有什么问题:
db.QUESTIONS.update({}, { $set: { i_pp : 0 } }, false, true);
我必须一次做一个文档还是什么?那看起来太复杂了。
- 更新**谢谢Sergio Tulentsev告诉我它不起作用。现在,我真的很纠结于如何做到这一点。我提供500 Profit Points给乐于助人的灵魂,谁可以写MongoDB理解的方式。如果你在our forum上注册,我可以添加利润点到您的帐户那里。
6条答案
按热度按时间ehxuflar1#
我在搜索MongoDB中的SQL等价物时遇到了这个问题,如下所示:
Sergio是正确的,在直接更新中不能引用另一个属性作为值。但是,
db.c.find(...)
返回cursor and that cursor has aforEach
method:对MongoDB的查询返回一个游标,它可以被迭代以检索结果。查询的确切方式将随语言驱动程序而变化。下面的详细信息集中在来自MongoDB shell(即
mongo
进程)的查询上。shell的
find()
方法返回一个cursor对象,然后我们可以通过迭代从结果中检索特定的文档,为此我们使用hasNext()
和next()
方法。此外,在shell中,
forEach()
可以与游标一起使用:所以你可以这样说:
一次更新一个而不离开MongoDB。
如果您使用驱动程序连接到MongoDB,那么应该有某种方法将JavaScript字符串发送到MongoDB;例如,对于Ruby驱动程序,您可以使用
eval
:其他语言应该类似。
20jt8wwn2#
q43xntqr3#
你不能在更新中使用表达式。或者说,你不能使用依赖于文档字段的表达式。简单的自包含数学表达式就可以了(例如
2 * 2
)。如果你想为所有的文档设置一个新的字段,这个新字段是其他字段的函数,你必须遍历这些字段并手动更新。
n8ghc7c14#
Rha7给出了一个好主意,但是上面的代码在没有定义临时变量的情况下无法工作。
此示例代码基于“birthday”字段生成年龄(场景后面的闰年)的近似计算,并将值插入到所有不包含以下内容的文档的适当字段中:
2g32fytz5#
删除来电显示开头的“00”示例:
b5buobof6#
我在另一个问题上做了一个类似这样的自引用文档表达式:
在Atlas免费层上,这需要很长时间才能执行,更新速率约为每秒35次