2012-03-24 15 views
11

Tôi cần sao chép (sao chép) một đối tượng trong bộ sưu tập qua dbshell. Có một cái gì đó như thế này:Làm thế nào để bạn sao chép (bản sao) một đối tượng MongoDB trong một bộ sưu tập của cùng một db?

> db.users.distinct('nickname') 
[ 
     "user1", 
     "user2", 
     "user3", 
     "user4" 
] 
> 

nơi user1 chọn một đối tượng phức tạp trong người dùng bộ sưu tập, làm thế nào tôi có thể lặp lại trong các đối tượng sau đó thay đổi (đổi tên) lĩnh vực user1 trong userX?

Trả lời

14

> user = db.users.findOne({'nickname': 'user1'}) 
> user.nickname = 'userX' 
> delete user['_id'] 
> db.users.insert(user) 

Mô tả

Bạn cần phải tìm đối tượng người dùng và đặt nó vào biến. Hơn bạn cần phải sửa đổi các tài sản mà bạn muốn và hơn bạn cần phải chèn toàn bộ đối tượng như mới. Để đạt được điều đó, bạn cần xóa thuộc tính _id mà đối tượng đã có. Và hơn là chỉ sử dụng insert để tạo tài khoản mới.

+0

đó là tuyệt vời, nhờ –

+0

@ LucaG.Soave Bạn được hoan nghênh! Cảm ơn bạn :) – lig

+0

@ LucaG.Save cập nhật của bạn cho mã của tôi đã thay đổi nó mạnh mẽ ý tưởng ban đầu là không xóa 'user1'. – lig

2

Trường _id là trường bắt buộc và chúng tôi không thể xóa trường như thế. Những gì tôi làm là gọi toJSON() cho đối tượng được trả về và sau đó xóa _id.

var rObject = dbObject.toJSON(); 
delete rObject._id; 
db.insert(rObject); 
5

Không xóa thuộc tính _id; vì một số lý do, một số giá trị mất type. Ví dụ, số nguyên được chuyển đổi thành tăng gấp đôi.

Sử dụng this solution:

var user = db.users.findOne(...) 
user._id = new ObjectId() 
// set other properties 
db.users.insert(user) 
+0

Câu trả lời này sẽ nhận được nhiều sự chú ý hơn ... – frhd

Các vấn đề liên quan