2012-12-23 10 views
7

की संपत्ति से एक फ़ील्ड सेट करने का प्रयास कर रहा हूं जो मैं करने की कोशिश कर रहा हूं वह बहुत सरल है, लेकिन मुझे नहीं पता कि एक फ़ील्ड को दूसरे के मूल्य को कैसे देना है।MongoDB अद्यतन। एक और

मैं बस एक फ़ील्ड को दूसरे की चरित्र गणना के साथ अपडेट करना चाहता हूं।

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

मैं इसे

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

डॉट नोटेशन दे रही है साथ ही जावास्क्रिप्ट वाक्य रचना

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

का उपयोग कर की कोशिश की है लेकिन अभी स्ट्रिंग की नकल की और एक "notOkforstorage" क्रमशः मिला है। कोई मदद?

अद्यतन: मैं केवल "notOkforStorage" जब मैं आईडी के आधार पर क्वेरी मिलती है:

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

उत्तर

15

निम्नलिखित कोड का प्रयास करें। यदि आप एक संपूर्ण संग्रह को संसाधित करना चाहते हैं, तो your_querry = {} का उपयोग करें।

आप परमाणु होने की सभी कार्यों चाहते हैं, update बजाय save का उपयोग करें:

db.collection.find(your_querry, { field2: 1 }).forEach(function(doc) { 
    db.collection.update({ _id: doc._id },{ $set: { field1: doc.field2.length } }); 
}); 
-1
  1. आपका गलत तरीके से exists उपयोग कर रहे हैं।
    Syntax: { field: { $exists: <boolean> } }

  2. आप $where का उपयोग करें जहां ऑपरेटर या तो एक स्ट्रिंग एक जावास्क्रिप्ट अभिव्यक्ति या क्वेरी प्रणाली

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

    के लिए एक पूर्ण JavaScript फ़ंक्शन युक्त पारित करने के लिए भी गलत
    $ उपयोग है

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

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

मुझे लगता है कि आप आप क्या करने की कोशिश कर रहे हैं के लिए Map-Reduce उपयोग करना चाहिए।

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

आप मूल संग्रह का ही हिस्सा चयन करने के लिए एक अद्यतन करते हैं your_querry उपयोग कर सकते हैं:

+1

मानचित्र को कम नहीं है मूल संग्रह को अद्यतन करने के लिए डिज़ाइन किया गया है, यह पिछले संग्रह के समेकित संस्करण से एक नया संग्रह बनाने के लिए डिज़ाइन किया गया है। – Sammaye

+0

मैं इस तरह से मौजूद उपयोग कर सकते हैं। – jwillis0720

0

जहाँ तक मुझे पता सबसे आसान तरीका पढ़ा है और aproach लिखें:

//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);