2012-12-23 10 views
7

zu setzen Was ich versuche zu tun, ist ziemlich einfach, aber ich kann nicht herausfinden, wie man ein Feld den Wert eines anderen gibt.MongoDB-Aktualisierung. Versuchen, ein Feld von einer Eigenschaft eines anderen

Ich möchte einfach ein Feld mit der Zeichenanzahl eines anderen aktualisieren.

db.collection.update({$exists:true},{$set : {field1 : field2.length}}) 

Ich habe versucht, es Punktnotation

db.collection.update({$exits:true},{$set : {field1: "this.field2.length"}}) 

Neben der Verwendung JavaScript-Syntax bzw.

db.collection.update({$exits:true}, 
        {$set : {field1: {$where : "this.field2.length"}}) 

Aber nur kopiert die Zeichenfolge und bekam ein "notOkforstorage" geben. Irgendeine Hilfe?

Update: erhalte ich nur die "notOkforStorage", wenn ich von ID abfragen:

db.collection.update({_id:ObjectID("38289842bbb")}, 
        {$set : {field1: {$where :"this.field2.length"}}}) 

Antwort

15

Versuchen Sie, den folgenden Code:

db.collection.find(your_querry).forEach(function(doc) { 
    doc.field1 = doc.field2.length; 
    db.collection.save(doc); 
}); 

Sie können your_querry verwenden nur einen Teil der ursprünglichen Sammlung wählen Sie ein Update durchführen kann. Wenn Sie eine gesamte Sammlung verarbeiten möchten, verwenden Sie your_querry = {}.

Wenn Sie alle Vorgänge wollen atomar sein, verwenden update statt save:

db.collection.find(your_querry, { field2: 1 }).forEach(function(doc) { 
    db.collection.update({ _id: doc._id },{ $set: { field1: doc.field2.length } }); 
}); 
-1
  1. Ihre exists in der falschen Art und Weise verwenden.
    Syntax: { field: { $exists: <boolean> } }

  2. Sie von $where verwenden, ist auch falsch
    Verwenden Sie die $, wo Operator entweder eine Zeichenkette mit einem JavaScript-Ausdruck oder eine vollständige JavaScript-Funktion auf das Abfragesystem

    db.myCollection.find({ $where: "this.credits == this.debits" }); db.myCollection.find({ $where: "obj.credits == obj.debits" });

    passieren

    db.myCollection.find({ $where: function() { return (this.credits == this.debits) } });

    db.myCollection.find({ $where: function() { return obj.credits == obj.debits; } });

ich glaube, Sie Map-Reduce für das, was verwenden, sollten Sie versuchen zu tun.

+1

Map reduzieren, ist nicht Zur Aktualisierung der ursprünglichen Sammlung wurde eine neue Sammlung aus der aggregierten Version der vorherigen Sammlung erstellt. – Sammaye

+0

kann ich verwenden, existiert auf diese Weise. – jwillis0720

0

Soweit ich weiß, ist der einfachste Weg die Lese- und aproach schreiben:

//At first, get/prepare your new value: 
var d= db.yourColl.fetchOne({....}); 
d.field1== d.field2.length; 

// then update with your new value 
db.yourColl.save(d); 
Verwandte Themen