2012-12-23 37 views
7

Điều tôi đang cố gắng thực hiện khá đơn giản, nhưng tôi không thể tìm ra cách để cung cấp cho một trường giá trị của một trường khác.Cập nhật MongoDB. Cố gắng đặt một trường từ thuộc tính của một trường khác

Tôi chỉ muốn cập nhật một trường có số ký tự của một trường khác.

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

tôi đã cố gắng cho nó ký hiệu dấu chấm

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

Cũng như sử dụng javascript cú pháp

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

Nhưng chỉ cần sao chép các chuỗi và có một "notOkforstorage" tương ứng. Bất kỳ giúp đỡ?

Cập nhật: tôi chỉ nhận được "notOkforStorage" khi tôi truy vấn của bạn:

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

Trả lời

15

Hãy thử đoạn mã sau:

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

Bạn có thể sử dụng your_querry để chọn chỉ là một phần của bộ sưu tập ban đầu làm thực hiện một bản cập nhật. Nếu bạn muốn xử lý toàn bộ bộ sưu tập, hãy sử dụng your_querry = {}.

Nếu bạn muốn tất cả các hoạt động được nguyên tử, sử dụng update thay vì save:

db.collection.find(your_querry, { field2: 1 }).forEach(function(doc) { 
    db.collection.update({ _id: doc._id },{ $set: { field1: doc.field2.length } }); 
}); 
-1
  1. của bạn đang sử dụng exists một cách sai lầm.
    Syntax: { field: { $exists: <boolean> } }

  2. Bạn sử dụng của $where cũng không đúng
    Sử dụng $ mà nhà điều hành để vượt qua hoặc là một chuỗi chứa một biểu thức JavaScript hoặc một hàm JavaScript đầy đủ với hệ thống truy vấn

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

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

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

Tôi nghĩ rằng bạn nên sử dụng Map-Reduce cho những gì bạn đang cố gắng làm.

+1

Bản đồ giảm không phải là được thiết kế để cập nhật bộ sưu tập gốc, nó được thiết kế để tạo ra một bộ sưu tập mới từ phiên bản tổng hợp của bộ sưu tập trước đó. – Sammaye

+0

Tôi có thể sử dụng theo cách này. – jwillis0720

0

Theo tôi biết cách đơn giản nhất là đọc và viết 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); 
Các vấn đề liên quan