MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Làm cách nào để chuyển sang mảng MongoDB với AngularJS?

Ở đây có một số điều không hay lắm, nhưng trước hết hãy bao gồm những điều cơ bản và giúp bạn tiến bộ.

Điều đầu tiên là sửa phương thức gọi dịch vụ bên góc. Điểm cuối API chắc chắn không mong đợi cú pháp cập nhật MongoDB mà bạn đang sử dụng, mà chỉ là một đối tượng. Vì vậy, trước tiên hãy khắc phục điều đó:

$scope.saveComment = function(i){
    console.log("id is " + i);

    // Split these out so they are easy to log and debug
    var path = '/api/its' + i;

    // This must mirror the structure expected in your document for the element
    // Therefore "comments" is represented as an array of objects, even
    // where this is only one.
    var data = { 
       comments: [{ 
         words: $scope.comment,
         userId: $scope.getCurrentUser().name 
       }]
    };

    // Call service with response
    $http.put(path,data).success(function(stuff){
      document.location.reload(true);
    });
}

Bây giờ phần cuối API máy chủ của bạn có một số lỗi, tôi muốn thiết kế lại toàn bộ, nhưng thiếu thông tin, chỉ tập trung khắc phục các sự cố chính mà không cần thay đổi nhiều.

Giả sử đây là lodash thư viện, .merge() chức năng ở đây được thực hiện không chính xác. Nó cần được cho biết cách "xử lý" nội dung mảng trong "hợp nhất" đúng cách, và hiện tại điều tốt nhất sẽ xảy ra là "ghi đè". Vì vậy, chúng tôi cung cấp cho nó một số thông minh:

// Updates an existing it in the DB.
exports.update = function(req, res) {
  if(req.body._id) { delete req.body._id; }
  It.findById(req.params.id, function (err, it) {
    if (err) { return handleError(res, err); }
    if(!it) { return res.send(404); }
    var updated = _.merge(it, req.body,function(a,b) {
        if (_.isArray(a)) {
            return a.concat(b);    // join source and input
        }
    });
    updated.save(function (err) {
      if (err) { return handleError(res, err); }
      return res.json(200, updated);
    });
  });
};`

Nhưng có một điểm cần lưu ý là nó sẽ chỉ "nối" vào mảng. Vì vậy, nếu bạn đặt một cái gì đó vào đầu vào của bạn đã có ở đó, thì cả các mục gốc và bất kỳ thứ gì trong đầu vào mảng sẽ được thêm vào.

Giải quyết vấn đề đó là cả một vấn đề khác cần giải quyết, tùy thuộc vào nhu cầu của bạn.

Theo quan điểm của riêng tôi, tôi sẽ chỉ gửi mảng nếu có thể và có một điểm cuối "chỉ" để thêm vào mảng của tài liệu, chứ không phải là bản cập nhật tài liệu "chung chung" như bạn có ở đây.

Điều này cho phép bạn sử dụng tốt hơn các chức năng cập nhật MongoDB, theo các hành động mong đợi. Vì vậy, một cái gì đó như thế này trong lệnh gọi dịch vụ:

// comment can just be a singular object now
$http.put(path,{ 
    "words": "this that", 
    "userId": 123
}).success(function(stuff){

Và trên kết thúc API máy chủ:

exports.addComment = function(req, res) {
  if(req.body._id) { delete req.body._id; }
  It.findByIdAndUpdate(req.params.id,
     { "$push": { "comments": req.body } },
     { "new": true },
     function(err,it) {
      if (err) { return handleError(res, err); }
      if(!it) { return res.send(404); }
      return res.json(200, it);
     }
  );
};

Vì vậy, điều đó sẽ chỉ đơn giản là lấy phần thân của một "nhận xét" và nối nó vào mảng. Quan trọng nhất là nó thực hiện điều này một cách "nguyên tử", do đó không có yêu cầu khả thi nào khác có thể xung đột trong việc thực hiện một cái gì đó giống như "hợp nhất" hiện tại đang làm. Các yêu cầu khác đến cùng một điểm cuối sẽ chỉ "nối" vào mảng ở trạng thái hiện tại như khi yêu cầu được thực hiện và điều này cũng vậy.

Đó là những gì $push toán tử là for, vì vậy bạn nên sử dụng nó một cách khôn ngoan.

Một số thực phẩm để suy nghĩ.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Truy vấn MongoDB trên các trường được điền

  2. Kết nối MongoDB từ Ứng dụng dựa trên thiết bị di động hoặc trình duyệt

  3. Chuyển đổi ObjectID (Mongodb) thành Chuỗi trong JavaScript

  4. Xác thực MongoDB 3.2 không thành công

  5. Tạo id đối tượng ngắn, duy nhất trong MongoDB