سؤال

أنا أتخيل foo يجري تحديث على التعليق الثالث، comments.2.value, ، بينما حاجِز يكون $pull-ing، إزالة التعليق الأول.

لو foo ينتهي أولاً، ثم يتم تحديث التعليق الثالث بنجاح، حيث أن الفهرس لا يزال صحيحًا.

لكن اذا حاجِز ينتهي أولا، ثم تغير الفهرس، و foocomments.2.value لن يؤثر على التعليق الثالث بعد الآن.

هل هذا السيناريو ممكن، وإذا كان كذلك، أتساءل عما إذا كانت هناك حلول مشتركة لتحديثات عناصر المصفوفة وحالة السباق؟

شكرًا لك !

هل كانت مفيدة؟

المحلول

الموقف الذي وصفته ممكن من الناحية النظرية إذا كانت هناك تطبيقات متعددة تصل إلى قاعدة البيانات في وقت واحد.لهذا السبب، من الأفضل، إن أمكن، إعطاء كل عضو في المصفوفة معرفًا فريدًا، بدلاً من الوصول إلى العناصر الموجودة في المصفوفة حسب الموضع.

على سبيل المثال،

> db.myComments.save({_id:1,
comments:[
{cid:1, author:"Marc", comment:"Marc's Comment"}, 
{cid:2, author:"Mike", comment:"Mike's Comment"}, 
{cid:3, author:"Barrie", comment:"Barrie's Comment"}
]})

إذا أردنا تعديل تعليق مايك، ولكننا لا نعرف بالضرورة أنه سيظهر في المرتبة الثانية في المصفوفة، فيمكننا تحديثه على النحو التالي:

> db.myComments.update({_id:1, "comments.cid":2}, {$set:{"comments.$.comment":"Mike's NEW Comment"}})
> db.myComments.find().pretty()
{
    "_id" : 1,
    "comments" : [
        {
            "cid" : 1,
            "author" : "Marc",
            "comment" : "Marc's Comment"
        },
        {
            "author" : "Mike",
            "cid" : 2,
            "comment" : "Mike's NEW Comment"
        },
        {
            "cid" : 3,
            "author" : "Barrie",
            "comment" : "Barrie's Comment"
        }
    ]
}

يمكننا أيضًا تغيير المستند الفرعي بأكمله، كما يلي:

> db.myComments.update({_id:1, "comments.cid":2}, {$set:{"comments.$":{cid:4, author:"someone else", comment:"A completely new comment!"}}})
> db.myComments.find().pretty()
{
    "_id" : 1,
    "comments" : [
        {
            "cid" : 1,
            "author" : "Marc",
            "comment" : "Marc's Comment"
        },
        {
            "cid" : 4,
            "author" : "someone else",
            "comment" : "A completely new comment!"
        },
        {
            "cid" : 3,
            "author" : "Barrie",
            "comment" : "Barrie's Comment"
        }
    ]
}

سوف يجد مستند الاستعلام القيمة الأولى في المصفوفة المطابقة، ويشير "$" في مستند التحديث إلى هذا الموضع.

يمكن العثور على مزيد من المعلومات حول عامل التشغيل "$" في قسم "عامل التشغيل الموضعي $" في وثائق "التحديث".http://www.mongodb.org/display/DOCS/Updating#Updating-The%24positionaloperator

نأمل أن يمنحك هذا فكرة عن كيفية قيام تطبيقك بتعديل القيم في مصفوفة دون الرجوع إلى موضعها.حظ سعيد!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top