我有一个文档列表,每个文档都有lat和lon属性(等等).
{ 'lat': 1, 'lon': 2, someotherdata [...] }
{ 'lat': 4, 'lon': 1, someotherdata [...] }
[...]
Run Code Online (Sandbox Code Playgroud)
我想修改它,使它看起来像这样:
{ 'coords': {'lat': 1, 'lon': 2}, someotherdata [...]}
{ 'coords': {'lat': 4, 'lon': 1}, someotherdata [...]}
[...]
Run Code Online (Sandbox Code Playgroud)
到目前为止,我有这个:
db.events.update({}, {$set : {'coords': {'lat': db.events.lat, 'lon': db.events.lon}}}, false, true)
Run Code Online (Sandbox Code Playgroud)
但它将db.events.lat和db.events.lon视为字符串.如何引用文档的属性?
干杯.
我一直在寻找一种方法来创建一个更新语句,该语句将使用现有的数字字段并使用表达式对其进行修改.例如,如果我有一个名为Price的字段,是否可以进行将Price设置为现有值50%的更新?
所以,给定 { Price : 19.99 }
我想做 db.collection.update({tag : "refurb"}, {$set {Price : Price * 0.50 }}, false, true);
可以这样做,还是我必须将值读回客户端,修改,然后更新?我想问题就是可以在更新中使用表达式,并且它们可以引用正在更新的文档.
我有一个集合t1,其架构中包含以下字段
_id, field1, field1
Run Code Online (Sandbox Code Playgroud)
我希望set field2的值field1类似于sql:
update t1 set field1=field2;
Run Code Online (Sandbox Code Playgroud)
我如何在MongoDB中执行此操作?
我想做这样的事情,但this似乎没有在update语句中设置关键字.
db.items.update({foo:…}, {$set: {bar: this.foo}}, false, true)
我必须用它eval来完成这个吗?
我想在集合中添加一个新字段,新字段的值设置为现有字段的值.
具体来说,我想从这里开始:
# db.foo.findOne()
{
"_id" : ObjectId("4f25c828eb60261eab000000"),
"created" : ISODate("2012-01-29T16:28:56.232Z"),
"..." : ...
}
Run Code Online (Sandbox Code Playgroud)
对此:
# db.foo.findOne()
{
"_id" : ObjectId("4f25c828eb60261eab000000"),
"created" : ISODate("2012-01-29T16:28:56.232Z"),
"event_ts" : ISODate("2012-01-29T16:28:56.232Z"), #same as created
"..." : ...
}
Run Code Online (Sandbox Code Playgroud)
(此集合中的新文档不会都具有这种特殊的冗余,但我想为现有文档执行此操作)
我需要sid在大约500K文档的集合中为每个文档创建一个新字段.每个sid都是独一无二的,并基于该记录的现有roundedDate和stream字段.
我正在使用以下代码:
var cursor = db.getCollection('snapshots').find();
var iterated = 0;
var updated = 0;
while (cursor.hasNext()) {
var doc = cursor.next();
if (doc.stream && doc.roundedDate && !doc.sid) {
db.getCollection('snapshots').update({ "_id": doc['_id'] }, {
$set: {
sid: doc.stream.valueOf() + '-' + doc.roundedDate,
}
});
updated++;
}
iterated++;
};
print('total ' + cursor.count() + ' iterated through ' + iterated + ' updated ' + updated);
Run Code Online (Sandbox Code Playgroud)
它起初效果很好,但几个小时后大约有100K记录,它出错了:
Error: getMore command failed: {
"ok" : …Run Code Online (Sandbox Code Playgroud) 使用 Mongo shell,我尝试添加一个与集合中所有文档的现有字段具有相同值的字段。假设我们有两个文档:
{
'foo': 'str1'
}
Run Code Online (Sandbox Code Playgroud)
和
{
'foo': 'str2'
}
Run Code Online (Sandbox Code Playgroud)
我想插入一个新字段'foo_new',其值分别为'foo',以便文档成为
{
'foo': 'str1'
'foo_new': 'str1'
}
Run Code Online (Sandbox Code Playgroud)
和
{
'foo': 'str2'
'foo_new': 'str2'
}
Run Code Online (Sandbox Code Playgroud)
我用来在 Mongo shell 中更新集合(例如“coll”)的命令是
db.coll.update({}, {$set: {'foo_new': '$foo'}}, {multi: true})
Run Code Online (Sandbox Code Playgroud)
运行该命令的结果是两个更新的文档
{
'foo': 'str1'
'foo_new': '$foo'
}
Run Code Online (Sandbox Code Playgroud)
和
{
'foo': 'str2'
'foo_new': '$foo'
}
Run Code Online (Sandbox Code Playgroud)
ie'$foo'由于某种原因被解释为文字。
我想知道是否有办法在MongoDB中进行自引用更新,因此您可以在$ set查询中使用对象的参数.这是一个例子:
> db.labels.save({"name":"label1", "test":"hello"})
> db.labels.save({"name":"label2", "test":"hello"})
> db.labels.save({"name":"label3", "test":"hello"})
> db.labels.find()
{ "_id" : ObjectId("4f1200e2f8509434f1d28496"), "name" : "label1", "test" : "hello" }
{ "_id" : ObjectId("4f1200e6f8509434f1d28497"), "name" : "label2", "test" : "hello" }
{ "_id" : ObjectId("4f1200eaf8509434f1d28498"), "name" : "label3", "test" : "hello" }
Run Code Online (Sandbox Code Playgroud)
我看到,您可以使用$该语法,其中查询:http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-JavascriptExpressionsand%7B%7B%24where%7D%7D
> db.myCollection.find( { a : { $gt: 3 } } );
> db.myCollection.find( { $where: "this.a > 3" } );
> db.myCollection.find("this.a > 3");
> f = function() { return this.a > …Run Code Online (Sandbox Code Playgroud) 我需要转换这样的字段:
{
"_id" : ObjectId("576fd6e87d33ed2f37a6d526"),
"phoneme" : "JH OY1 N Z"
}
Run Code Online (Sandbox Code Playgroud)
进入像这样的子串数组
{
"_id" : ObjectId("576fd6e87d33ed2f37a6d526"),
"phonemes" : [ "JH", "OY1", "N", "Z" ]
}
Run Code Online (Sandbox Code Playgroud)
有时会变成像这样的字符数组
{
"_id" : ObjectId("576fd6e87d33ed2f37a6d526"),
"phonemes" : ["J", "H", " ", "O", "Y", "1", " ", "N", " ", "Z"]
}
Run Code Online (Sandbox Code Playgroud)
我在这里发现了一些将字符串转换为数组的代码,但是对于我的目的来说有点太简单了,因为只创建了一个数组元素.
db.members.find().snapshot().forEach( function (x) {
x.photos = [{"uri": "/images/" + x.photos}];
db.members.save(x);
});
Run Code Online (Sandbox Code Playgroud)
我是否可以在mongo shell语句中使用整个javascript语言?
例如,我有一些如下所示的文档:
{
id: 1
name: "foo"
}
Run Code Online (Sandbox Code Playgroud)
我想将另一个附加string到当前name字段值。
我使用 Mongoose 尝试了以下操作,但没有成功:
Model.findOneAndUpdate({ id: 1 }, { $set: { name: +"bar" } }, ...);
Run Code Online (Sandbox Code Playgroud)