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

Làm cách nào để lấy lại giá trị mới sau khi cập nhật trong một mảng được nhúng?

Nếu bạn đang sử dụng MongoDB 3.0 hoặc mới hơn, bạn cần sử dụng .findOneAndUpdate() và sử dụng projection tùy chọn để chỉ định tập hợp con của các trường để trả về. Bạn cũng cần đặt returnNewDocument thành true . Tất nhiên, bạn cần sử dụng $elemMatch toán tử phép chiếu ở đây vì bạn không thể sử dụng phép chiếu vị trí và trả lại tài liệu mới.

Như ai đó đã chỉ ra:

Bạn nên sử dụng .findOneAndUpdate() bởi vì .findAndModify() được đánh dấu là không còn được dùng trong mọi trình điều khiển ngôn ngữ chính thức. Điều khác là cú pháp và các tùy chọn khá nhất quán giữa các trình điều khiển cho .findOneAndUpdate() . Với .findAndModify() , hầu hết các trình điều khiển không sử dụng cùng một đối tượng duy nhất với các phím "truy vấn / cập nhật / trường". Vì vậy, sẽ đỡ khó hiểu hơn một chút khi ai đó áp dụng một ngôn ngữ khác để được nhất quán. Các thay đổi API được tiêu chuẩn hóa cho .findOneAndUpdate() thực sự tương ứng với bản phát hành máy chủ 3.x thay vì 3.2.x. Sự khác biệt đầy đủ là các phương thức shell thực sự tụt hậu so với các trình điều khiển khác (một lần!) Trong việc triển khai phương thức. Vì vậy, hầu hết các trình điều khiển thực sự đã có một đợt phát hành lớn tương ứng với bản phát hành 3.x với những thay đổi như vậy.

db.collection.findOneAndUpdate( 
    { 
        "_id": ObjectId("56d6a7292c06e85687f44541"), 
         "rankings._id" : ObjectId("46d6a7292c06e85687f55543") 
    },  
    { $inc : { "rankings.$.score" : 1 } },  
    { 
        "projection": { 
            "rankings": { 
                "$elemMatch": { "_id" : ObjectId("46d6a7292c06e85687f55543") } 
            }
        }, 
        "returnNewDocument": true 
    }
)

Từ MongoDB 3.0 trở đi, bạn cần sử dụng findAndModify và các trường fields các tùy chọn bạn cũng cần đặt new thành true khác để trả về giá trị mới.

db.collection.findAndModify({   
    query: { 
        "_id": ObjectId("56d6a7292c06e85687f44541"), 
        "rankings._id" : ObjectId("46d6a7292c06e85687f55543") 
    },     
    update: { $inc : { "rankings.$.score" : 1 } },       
    new: true,  
    fields: { 
        "rankings": { 
            "$elemMatch": { "_id" : ObjectId("46d6a7292c06e85687f55543") }
        }  
    }
})

Cả hai truy vấn đều mang lại:

{
        "_id" : ObjectId("56d6a7292c06e85687f44541"),
        "rankings" : [
                {
                        "_id" : ObjectId("46d6a7292c06e85687f55543"),
                        "name" : "Ranking 2",
                        "score" : 11
                }
        ]
}



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Tại sao các ObjectIds MongooseJS của tôi không thành công trong bài kiểm tra bình đẳng?

  2. Mongoose điền mảng lồng nhau

  3. Mongoose - xác thực cú pháp email

  4. chỉ mục thưa thớt và giá trị null trong mongo

  5. Tổng hợp với cập nhật trong mongoDB