Cập nhật đồng thời trong mongodb

Chúng tôi đang thực hiện một dự án với 300 tài liệu có trường

{
    "_id" : ObjectId("..."),
    "mainId" : ObjectId("..."),
    "amount" : 5,
}
5 trong bộ sưu tập chính, để theo dõi lịch sử của từng tài liệu của bộ sưu tập đầu tiên. chúng tôi đã tạo một bộ sưu tập khác có tên là
{
    "_id" : ObjectId("..."),
    "mainId" : ObjectId("..."),
    "amount" : 5,
}
6 với khoảng 6. 5 triệu tài liệu. Đối với mỗi đầu vào của hệ thống, chúng tôi phải thêm khoảng 30 mục lịch sử và cập nhật trường
{
    "_id" : ObjectId("..."),
    "mainId" : ObjectId("..."),
    "amount" : 5,
}
5 của bộ sưu tập chính, vì vậy, Chúng tôi đã thử mẫu thiết kế trường tính toán cho
{
    "_id" : ObjectId("..."),
    "mainId" : ObjectId("..."),
    "amount" : 5,
}
5, điều này giúp chúng tôi có
{
    "_id" : ObjectId("..."),
    "mainId" : ObjectId("..."),
    "amount" : 5,
}
9 trong các tình huống đồng thời (đồng thời có khoảng 1000 yêu cầu)

Sau đó, chúng tôi đã cố gắng tính toán trường

{
    "_id" : ObjectId("..."),
    "mainId" : ObjectId("..."),
    "amount" : 5,
}
5 với
{
    "_id" : ObjectId("..."),
    "mainId" : ObjectId("..."),
    "amount" : 5,
}
0 (trường ______01) và
{
    "_id" : ObjectId("..."),
    "mainId" : ObjectId("..."),
    "amount" : 5,
}
2(trường ______03) trên bộ sưu tập lịch sử mất quá nhiều thời gian (> 3 giây)

Tài liệu sưu tập chính

{
    "_id" : ObjectId(...),
    "stock" : [ 
        {
            "currentAmount" : -313430.0,
            "lastPrice" : -10.0,
            "storage" : ObjectId("..."),
            "alarmCapacity" : 12
        }, 
        {
            "currentAmount" : 30,
            "lastPrice" : 0,
            "storage" : ObjectId("..."),
            "alarmCapacity" : 12
        }, 
       .
       .
       .
    ],
    "name" : "name",

}


Tài liệu sưu tầm lịch sử

{
    "_id" : ObjectId("..."),
    "mainId" : ObjectId("..."),
    "amount" : 5,
}

Nếu bạn có bất kỳ ý tưởng nào khác để xử lý tình huống này (cấp độ ứng dụng hoặc db), tôi sẽ rất biết ơn

CẬP NHẬT 1

Truy vấn cập nhật nếu tôi sử dụng mẫu được tính toán sẽ là

mainCollection.findOneAndUpdate(
            {
                $and: [
                    { _id: id },
                    { "stock.storage": fromId },
                    { "stock.deletedAt": null }
                ],
            },
            {
                $inc: {
                    "stock.$.currentAmount": -1 * amount,
                }
            },
            {
                session
            }
        )

Và đường dẫn Tổng hợp nếu tôi muốn tính toán

{
    "_id" : ObjectId("..."),
    "mainId" : ObjectId("..."),
    "amount" : 5,
}
4 mọi lúc

________số 8

Hiện tại, chúng tôi đang gặp phải rất nhiều vấn đề trong môi trường sân khấu, trong đó do cả tính không đồng bộ của nút và đồng thời mongo,

Chúng tôi đang thấy các cuộc gọi song song được thực hiện và do đó chúng tôi có thể thấy số lượng của mình không khớp,

chúng tôi không có khóa duy nhất để đặt, nhưng ngay cả khi chúng tôi đã thử đặt chỉ mục duy nhất, ngay cả khi đó, chúng tôi đang chạy tải dữ liệu 100k +, đối với một số bản ghi, chúng tôi có thể thấy các bản sao được chèn vào

Tôi đã bắt đầu sử dụng MongoDB tại nơi làm việc cho đến nay rất tốt. Tôi đã tự hỏi làm thế nào để MongoDB xử lý các bản cập nhật đồng thời?

Cảm ơn

- stackoverflow. com

ghi bàn. 45

câu trả lời được chấp nhận

MongoDB đã sử dụng khóa ghi trên toàn quy trình để đảm bảo rằng chỉ có thể thực hiện một thao tác ghi (cập nhật/chèn/xóa) tại một thời điểm. Do đó, nó tự động giải quyết các vấn đề tương tranh vì ghi đồng thời đơn giản là không được phép

Nếu 4 luồng cố gắng thực hiện thao tác cập nhật, một trong số chúng sẽ thực hiện khóa ghi, thực hiện cập nhật và giải phóng khóa. Sau đó, một trong 3 người còn lại sẽ lấy khóa, thực hiện cập nhật, v.v.

Đồng thời chỉ phát huy tác dụng nếu hoạt động của bạn không thể gói gọn trong một thao tác ghi đơn lẻ. Lưu ý rằng đối với trường hợp sử dụng phổ biến nhất (tìm tài liệu, cập nhật tài liệu và lấy phiên bản mới một cách nguyên tử) MongoDB cung cấp lệnh "findAndModify" để thực hiện điều đó. http. //www. mongodb. org/hiển thị/DOCS/findAndModify+Command

Để cập nhật, chỉ cần sử dụng update(). Sử dụng toán tử $push để nối thêm một giá trị đã chỉ định và ký hiệu dấu chấm để tiếp cận bộ sưu tập phụ và cập nhật bên trong update()

Hãy để chúng tôi tạo một bộ sưu tập với các tài liệu -

> db.demo547.insertOne(
.. {
..    Name : "Chris",
..    Test :
..    {
..       "FirstTest" :
..       {
..          Scores: [56,29,76]
..       },
..       "SecondTest" :
..       {
..          Scores: [98,91,78]
..       }
..    }
.. }
.. );
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e8e2d579e5f92834d7f05dd")
}

Hiển thị tất cả các tài liệu từ một bộ sưu tập với sự trợ giúp của phương thức find() -

{
    "_id" : ObjectId("..."),
    "mainId" : ObjectId("..."),
    "amount" : 5,
}
0

Điều này sẽ tạo ra đầu ra sau -

{
    "_id" : ObjectId("..."),
    "mainId" : ObjectId("..."),
    "amount" : 5,
}
1

Sau đây là truy vấn cập nhật đồng thời với bộ sưu tập con -

{
    "_id" : ObjectId("..."),
    "mainId" : ObjectId("..."),
    "amount" : 5,
}
2

Hiển thị tất cả các tài liệu từ một bộ sưu tập với sự trợ giúp của phương thức find() -

{
    "_id" : ObjectId("..."),
    "mainId" : ObjectId("..."),
    "amount" : 5,
}
0

Điều này sẽ tạo ra đầu ra sau -

{
    "_id" : ObjectId("..."),
    "mainId" : ObjectId("..."),
    "amount" : 5,
}
4

Cập nhật đồng thời trong mongodb


Cập nhật đồng thời trong mongodb

MongoDB có đồng thời không?

MongoDB cho phép nhiều máy khách đọc và ghi cùng một dữ liệu . Để đảm bảo tính nhất quán, MongoDB sử dụng kiểm soát khóa và đồng thời để ngăn khách hàng sửa đổi cùng một dữ liệu đồng thời.

Đa tùy chọn trong bản cập nhật trong MongoDB là gì?

Theo mặc định, db. thu thập. phương thức update() cập nhật một tài liệu. Bao gồm tùy chọn đa. true để cập nhật tất cả các tài liệu phù hợp với tiêu chí truy vấn .

Khóa nào trong MongoDB cung cấp đồng thời?

MongoDB sử dụng khóa trình đọc-ghi cho phép trình đọc đồng thời chia sẻ quyền truy cập vào tài nguyên, chẳng hạn như cơ sở dữ liệu hoặc bộ sưu tập

Upsert trong bản cập nhật MongoDB là gì?

Trong MongoDB, upsert là một tùy chọn được sử dụng cho thao tác cập nhật e. g. cập nhật (), findAndModify (), v.v. Hay nói cách khác upsert là sự kết hợp giữa update và insert (update + insert = upsert).