2017-01-24 15 views
5

tôi đã có doc sau trong db của tôi:Tại sao ký hiệu dấu chấm mongo thay thế toàn bộ một subdocument?

{ 
    "_id": ObjectId("ABCDEFG12345"), 
    "options" : { 
    "foo": "bar", 
    "another": "something" 
    }, 
    "date" : { 
    "created": 1234567890, 
    "updated": 0 
    } 
} 

Và tôi muốn cập nhật options.foodate.updated cùng một lúc sử dụng ký hiệu dấu chấm, như vậy:

var mongojs = require('mongojs'); 

var optionName = 'foo'; 
var optionValue = 'baz'; 

var updates = {}; 
updates['options.' + optionName] = optionValue; 
updates['date.updated'] = new Date().getTime(); 

db.myCollection.findAndModify({ 
    query : { 
     _id : ObjectId('ABCDEFG12345') 
    }, 
    update : { 
     $set : updates 
    }, 
    upsert : false, 
    new : true 
}, function(error, doc, result) { 

    console.log(doc.options); 
    console.log(doc.date); 

}); 

Và kết quả này trong :

{ 
    foo : 'baz', 
    another : 'something' 
} 
{ 
    updated : 1234567890 
} 

Cụ thể, trường trước đây date.created của tôi đang bị ghi đè mặc dù tôi là chúng tôi ng dấu chấm.

Tại sao điều này chỉ hoạt động một phần? Tài liệu phụ options vẫn giữ lại dữ liệu đã tồn tại trước đó (options.another), tại sao tài liệu phụ date không giữ lại dữ liệu đã tồn tại trước đó của nó?

+0

Tôi đã chạy mã trên và nhận được kết quả mong đợi '{foo: 'baz', một cái khác: 'something'} {created: 1234567890, updated: 1486112116738}'. Bạn có chắc chắn dữ liệu/mã của bạn như trên không? – sheilak

+0

100%. Tôi phải kiểm tra nó 50 lần. Nó không có ý nghĩa, phải không? Tôi đã có các mô-đun khác sử dụng cùng một kỹ thuật và đạt được kết quả mong đợi, nhưng không phải vì lý do nào đó. Hy vọng sẽ tìm thấy một trường hợp cạnh tranh mà người khác đã gặp phải. – AJB

+0

Tôi đồng ý với @sheilak nó cũng tốt cho tôi. AJB Bạn có thể vui lòng đăng các bước tài liệu và mã chính xác không. – Avi

Trả lời

2

Các hành vi được mô tả thường xảy ra khi đối tượng thông qua trong các nhà điều hành $set có dạng { "data" : { "updated" : 1234567890 } } hơn { "data.updated" : 1234567890 }, nhưng tôi không quen thuộc với dấu chấm trong JavaScript đủ để biết đó có thể là nguyên nhân đứng về phía JS của.

Ngoài ra, nó sẽ không giải thích lý do tại sao nó xảy ra với data và không phải options.

Nếu bạn có thể in đối tượng được lưu trữ trong biến updates và được gửi đến MongoDB trong trường update, điều đó sẽ cho phép biết bên nào vấn đề là (JS hoặc MongoDB).

+0

Một điểm để minh họa những gì sẽ xảy ra có thể giúp người qua đường khác, nhưng ký hiệu chấm phải đạt được kết quả mong đợi, ngoại trừ nó không phải. – AJB

1

tôi chuyển mã của bạn đến môi trường thử nghiệm và sử dụng cùng một thư viện bạn đang sử dụng. Thư viện mongojs, cho truy vấn của ObjectId nguyên gốc là như thế này mongojs.ObjectId ("####") Can look the official documentation.

cho hàm callback trong hàm findAndModify, tham số tài liệu là một mảng vì vậy tôi hãy điều hướng như một mảng enter image description here

Lưu ý: [để nối chuỗi tôi sử dụng mẫu literals] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals)

Tất cả làm việc tốt ...

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