Mongoose: لا يحفظ Model.save () المصفوفات المضمنة

تم إنشاؤها على ١٠ نوفمبر ٢٠١٢  ·  26تعليقات  ·  مصدر: Automattic/mongoose

لدي مصفوفات متداخلة من المستندات ، وعندما أقوم بتغييرها وإجراء حفظ () على النموذج ، لا يتم حفظ التغييرات في المستند المتداخل.

فيما يلي نماذجي ومخططاتي (بعضها مطلوب للإيجاز):

var Votes = new mongoose.Schema({
    date: Date, 
    user_name: String,
    is_up: Boolean
});

var EventSchema = new mongoose.Schema({
  to_date: Date,
  from_date: Date,
  location: String,
  name: String,
  suggested_by: String,
  description: String,
  users: [EventUser],
  comments: [Comments],
  suggestions: [Event],
  votes: [Votes]
});

var Event = mongoose.model('Event', EventSchema);

النموذج قبل event.save () يسمى:

{ 
     __v: 1,
    _id: 509e87e583ccbfa00e000004,
    description: 'Pfft',
    from_date: Sun Nov 11 2012 08:00:00 GMT-0500 (EST),
    location: 'Home',
    name: 'Whatever',
    suggested_by: 'No one',
    to_date: Sun Nov 11 2012 00:00:00 GMT-0500 (EST),
    votes: [],
    suggestions: 
     [ { users: [],
         comments: [],
         suggestions: [],
         votes: [],
         _id: 509e880883ccbfa00e000005,
         suggested_by: 'Some one',
         to_date: Sun Nov 11 2012 04:00:00 GMT-0500 (EST),
         from_date: Mon Nov 12 2012 00:00:00 GMT-0500 (EST),
         location: 'Home',
         name: 'Football',
         description: 'FOOTBALL!!' } ],
    comments: [],
    users: [] 
}

نفس الكائن مع الأصوات المتداخلة مباشرة قبل استدعاء event.save() .

{
   "__v":1,
   "_id":"509e87e583ccbfa00e000004",
   "description":"Pfft",
   "from_date":"2012-11-11T13:00:00.000Z",
   "location":"Home",
   "name":"Whatever",
   "suggested_by":"No one",
   "to_date":"2012-11-11T05:00:00.000Z",
   "votes":[ ],
   "suggestions":
      [ {
         "users":[],
         "comments":[ ],
         "suggestions":[ ],
         "votes":
            [{
               "is_up":true,
               "date":"2012-11-10T18:05:25.796Z",
               "user_name":"No one"
            }],
         "_id":"509e880883ccbfa00e000005",
         "suggested_by":"Some one",
         "to_date":"2012-11-11T09:00:00.000Z",
         "from_date":"2012-11-12T05:00:00.000Z",
         "location":"Home",
         "name":"Football",
         "description":"FOOTBALL!!"
      }],
   "comments":[],
   "users":[]
}

عندما يتم استدعاء event.save () ، لا يتم إلقاء أي خطأ ، ولكن مخطط الأصوات المتداخلة داخل مخطط الأحداث المتداخلة لا يتم حفظه بالفعل. إذا استخدمت نفس المنطق العام في كائن حدث المستوى الأعلى لحفظ تصويت ، فإنه يعمل.

عندما نظرت في الكود ، باختصار ، يبدو أن .save () يُفترض أنه اختصار لكل من حفظ كائنات جديدة ، بالإضافة إلى تحديث الكائنات الموجودة بالفعل.

حدسي هو Model.prototype._delta لا يتعمق بما يكفي لالتقاط كل الكائنات المتداخلة ، https://github.com/LearnBoost/mongoose/blob/master/lib/model.js#L529

التعليق الأكثر فائدة

أرى ما هي المشكلة - الحالة الكلاسيكية للسؤال الأول في الأسئلة الشائعة للنمس.

شكرا ، لقد كانت هذه المشكلة في حالتي! :)

model.myArray[index] = anyValue

يصبح

model.myArray.set(index, anyValue)

ال 26 كومينتر

يرجى أيضًا تضمين الرمز الذي تستخدمه لإعادة إنتاج المشكلة (حيث تقوم بمعالجة المستند قبل الحفظ وما إلى ذلك)

بالتأكيد ، لقد نشرته في جوهر لتجنب جدار من التعليمات البرمجية هنا ، https://gist.github.com/4055392

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

حاول إصلاح مرجع EventSchema المستخدم في suggestions :

// bad
var EventSchema = new mongoose.Schema({
  suggestions: [EventSchema] <== at this time, EventSchema is undefined which is interpreted as Mixed

// instead...

var EventSchema = new mongoose.Schema;
EventSchema.add({
  suggestions: [EventSchema] <== EventSchema exists
})


إغلاق ، لا يوجد رد. يرجى إعادة الفتح إذا لزم الأمر.

لدي نفس المشكلة حيث يقوم .save () بإرجاع مستند قام بتحديث الكائن المضمن ولكن لم يتم حفظه بالفعل في mongodb. . الرجاء مساعدتي في هذا الأمر

@ Manojkumar91 هل يمكنك تقديم بعض التعليمات البرمجية التي تعيد صياغة هذا؟ سيكون مفيدا جدا :)

لقد واجهت هذا أيضًا ، هذا هو نموذجي:

/*jslint node:true */
"use strict";

var mongoose = require('mongoose'),
    Schema = mongoose.Schema;

var measurement = new Schema({
    name: {type: String, required: true},
    instruction: {type: String, required: true}
});

var size = new Schema({
    name: {type: String, required: true},
    lengths: [String]
});

var chartSchema = new Schema({
    name: {type: String, required: true },
    diagram: {type: String, required: true },
    description: {type: String, required: true},
    totalMeasurements: {type: Number, required: true},
    totalSizes: {type: Number, required: true},
    measurements: [measurement],
    sizes: [size]
});

module.exports = mongoose.model('chart', chartSchema);

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

    module.exports = function (next) {
      var paramCounter = 1,
          outerLoopCounter = 0,
          existingSizes = this.chart.sizes.length,
          outerLoopEdge = this.chart.totalSizes,
          innerLoopCounter = 0,
          innerloopEdge = this.chart.totalMeasurements - 1,
          size = {name: null, lengths: [] };

      if (this.req.method && this.req.method === "POST") {
          for (outerLoopCounter;
                  outerLoopCounter < existingSizes;
                  outerLoopCounter = outerLoopCounter + 1) {

              this.chart.sizes[outerLoopCounter].name =
                  this.param("name_" + paramCounter);

              for (innerLoopCounter;
                      innerLoopCounter <= innerloopEdge;
                      innerLoopCounter = innerLoopCounter + 1) {
                  this.chart.sizes[outerLoopCounter].lengths[innerLoopCounter] =
                      this.param(this.chart.measurements[innerLoopCounter].name);
              }
              paramCounter = paramCounter + 1;
              innerLoopCounter = 0;
          }

        for (outerLoopCounter;
                outerLoopCounter < outerLoopEdge;
                outerLoopCounter = outerLoopCounter + 1) {
            size.name = this.param("name_" + paramCounter);
            for (innerLoopCounter;
                    innerLoopCounter < innerloopEdge;
                    innerLoopCounter = innerLoopCounter + 1) {
                size.lengths.push(
                    this.param(this.chart.measurements[innerLoopCounter].name
                               + "_" + paramCounter)
                );
            }
            this.chart.sizes.push(size);
            paramCounter = paramCounter + 1;
            innerLoopCounter = 0;
            size = { name: null, lengths: [] };
        }

        this.chart.save(function (err) {
            if (err) {
                console.log(err);
            }

            this.chart_info = "measurements for <strong>" + this.chart.name + "</strong> saved.";
            this.render("display");
        }.bind(this));
    } else {
        next();
    }
  };

ساري المفعول قبل تشغيل هذا المرشح ، يتم استدعاء عامل التصفية الذي يقوم بإنشاء بنية نموذج تعتمد على الحالة بناءً على المصفوفة ثنائية الأبعاد للقياسات والأحجام ، ثم يتم تحليل قائمة العناصر هذه لتوفير التحديثات. لقد كنت أختبر باستخدام بيانات وهمية ويبدو المخطط الوهمي الحالي (مأخوذ من وحدة التحكم) كما يلي:

> db.charts.find();
{ "_id" : ObjectId("553da6c3d3d0940a640e878c"), "name" : "Chart With Measurements", "diagram" : "http://res.cloudinary.com/harung71k/image/upload/v1430103747/nd4gipcxnykbbcpcztp9.jpg", "description" : "<p>This is a test of the new measurement methodology, it works.</p>", "totalMeasurements" : 4, "totalSizes" : 3, "sizes" : [ { "name" : "Small", "_id" : ObjectId("554183ed63c5945b73b8a8e7"), "lengths" : [ "1", "2", "3", "4" ] }, { "name" : "Medium", "_id" : ObjectId("554183ed63c5945b73b8a8e8"), "lengths" : [ "5", "6", "7", "8" ] }, { "name" : "Large", "_id" : ObjectId("554183ed63c5945b73b8a8e9"), "lengths" : [ "9", "10", "11", "12" ] } ], "measurements" : [ { "name" : "Fuzz", "instruction" : "<p>Fuzz Instructions</p>", "_id" : ObjectId("553dadd253eb9f996c68a381") }, { "name" : "Buzz", "instruction" : "<p>Buzz Instructions</p>", "_id" : ObjectId("553dadd253eb9f996c68a382") }, { "name" : "Beatles", "instruction" : "<p>Beatles Instructions</p>", "_id" : ObjectId("553dadd253eb9f996c68a383") }, { "name" : "Stones", "instruction" : "<p>Stones instructions</p>", "_id" : ObjectId("553ee7a09ff8c567004bd261") } ], "__v" : 3 }

لقد اختبرت مصفوفة الأحجام المعدلة قبل الحفظ مباشرةً ، نظرًا لإدخال "1111" في فتحة الأحجام [0]. أطوال [0] وهذا يظهر في المستند عند فحصه في Node ، لكن الحفظ يعود تمامًا هذا المستند نفسه للحفظ المسبق.

يرجى إعلامي إذا كنت بحاجة إلى أي تفاصيل إضافية.

@ crispen-smith سأحتاج إلى بعض التوضيح ، هناك الكثير من التعليمات البرمجية بالنسبة لي لأتمكن من فهمها بسهولة. هل يمكنك تمكين وضع تصحيح أخطاء النمس باستخدام require('mongoose').set('debug', true); وترحيل المخرجات؟ هذا يظهر لي الاستفسارات والكتابة التي يتم إرسالها إلى الخادم.

نعم ، هناك الكثير من التعليمات البرمجية ، ولكن في نفس الوقت ... لا يكفي لشرحها بسهولة.

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

Mongoose: charts.findOne({ name: 'Chart With Measurements' }) { fields: undefined }  
Mongoose: charts.update({ _id: ObjectId("553da6c3d3d0940a640e878c"), __v: 3 }) { '$set': { 'sizes.0.name': 'Smaller' } } {} 

فيما يلي تشغيل نفس تسلسل العملية مع تغيير اسم وقيمة من مصفوفة السلاسل:

Mongoose: charts.findOne({ name: 'Chart With Measurements' }) { fields: undefined }  
Mongoose: charts.update({ _id: ObjectId("553da6c3d3d0940a640e878c"), __v: 3 }) { '$set': { 'sizes.0.name': 'Small' } } {} 

ومع التغيير فقط في متغير داخل المصفوفة:

Mongoose: charts.findOne ({name: 'Chart With Measurement}) {الحقول: undefined}
(نعم ، هذا كل شيء ... لا يوجد استعلام تحديث)

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

--تحديث--
لقد حاولت الحذف وإعادة التحميل ، ولكن لا يبدو أن ذلك يعمل أيضًا. على الرغم من عدم وجود تتبع إخراج لهذه القطعة ، يبدو أن الحذف لا يؤدي إلى تشغيل عملية خلفية أيضًا. هل هناك نوع من الفحص القذر لا يتم تشغيله؟

أي خيار لإعادة فتح هذا في ضوء ملاحظاتي أعلاه؟

@ crispen-smith ، ها هي محاولتي الأساسية لإعادة إنتاج المشكلة كنص مستقل:

var mongoose = require('mongoose');
mongoose.set('debug', true);
var util = require('util');
var assert = require('assert');

mongoose.connect('mongodb://localhost:27017/gh1204');

var Schema = mongoose.Schema;

var measurement = new Schema({
    name: {type: String, required: true},
    instruction: {type: String, required: true}
});

var size = new Schema({
    name: {type: String, required: true},
    lengths: [String]
});

var chartSchema = new Schema({
    measurements: [measurement],
    sizes: [size]
});

var Chart = mongoose.model('gh1204', chartSchema);

Chart.create({}, function(error, chart) {
  assert.ifError(error);
  chart.sizes.push({ name: 'bacon', lengths: ['25'] });
  chart.save(function(error, chart) {
    assert.ifError(error);
    assert.equal(chart.sizes[0].lengths.length, 1);
    assert.equal(chart.sizes[0].lengths[0], '25');
    console.log('done');
    process.exit(0);
  });
});

لا يوجد نرد حتى الآن ، يعمل كما هو متوقع. هل يمكنك تعديل المثال أعلاه لتوضيح المشكلة التي تراها؟ لم أتمكن من ترجمة أوصاف نثرك إلى كود.

بالتأكيد ، سألقي نظرة على هذا لاحقًا هذا المساء.

جرب هذا؟

/*jslint node:true */
"use strict";

var mongoose = require('mongoose');
mongoose.set('debug', true);
var util = require('util');
var assert = require('assert');

mongoose.connect('mongodb://localhost:27017/gh1204');

var Schema = mongoose.Schema;

var measurement = new Schema({
  name: {type: String, required: true},
  instruction: {type: String, required: true}
  });

var size = new Schema({
  name: {type: String, required: true},
  lengths: [String]
    });

var chartSchema = new Schema({
  measurements: [measurement],
  sizes: [size]
    });

var Chart = mongoose.model('gh1204', chartSchema);

Chart.create({}, function (error, chart) {
    assert.ifError(error);
    chart.sizes.push({ name: 'bacon', lengths: ['25'] });
    chart.save(function (error, chart) {
      assert.ifError(error);
     assert.equal(chart.sizes[0].lengths.length, 1);
     assert.equal(chart.sizes[0].lengths[0], '25');
     console.log('Created Index');

    chart.sizes[0].lengths[0] = "20";

  chart.save(function (error, chart) {
    assert.ifError(error);
    assert.equal(chart.sizes[0].lengths.length, 1);
    assert.equal(chart.sizes[0].lengths[0], '25');
    console.log('Created Index');
    process.exit(0);

    });
  });
});

هذا هو إخراج وحدة التحكم الخاصة بي في وحدة تحكم العقدة الخاصة بي:

Crispens-MacBook-Pro:mongooseTest crispensmith$ node index.js
Mongoose: gh1204.insert({ _id: ObjectId("5580d0c44d32b07971dfd281"), sizes: [], measurements: [], __v: 0 })   
Mongoose: gh1204.update({ __v: 0, _id: ObjectId("5580d0c44d32b07971dfd281") }) { '$set': { measurements: [] }, '$pushAll': { sizes: [ { name: 'bacon', _id: ObjectId("5580d0c44d32b07971dfd282"), lengths: [ '25' ] } ] }, '$inc': { __v: 1 } }  
Created Index
Mongoose: gh1204.update({ __v: 1, _id: ObjectId("5580d0c44d32b07971dfd281") }) { '$set': { measurements: [] }, '$inc': { __v: 1 } }  

/Users/crispensmith/Documents/mongooseTest/node_modules/mongoose/node_modules/mpromise/lib/promise.js:108
إذا (انتهى هذا &&! this.hasRejectListeners ()) طرح السبب ؛
^
AssertionError: "20" == "25"
في EventEmitter.(/Users/crispensmith/Documents/mongooseTest/index.js:44:14)
في EventEmitter.(/Users/crispensmith/Documents/mongooseTest/node_modules/mongoose/node_modules/mpromise/lib/promise.js:175:45)
في EventEmitter.emit (events.js: 98: 17)
في Promise.safeEmit (/Users/crispensmith/Documents/mongooseTest/node_modules/mongoose/node_modules/mpromise/lib/promise.js:81:21)
في Promise.fulfill (/Users/crispensmith/Documents/mongooseTest/node_modules/mongoose/node_modules/mpromise/lib/promise.js:94:24)
في Promise.resolve (/Users/crispensmith/Documents/mongooseTest/node_modules/mongoose/lib/promise.js:113:23)
في النموذج.(/Users/crispensmith/Documents/mongooseTest/node_modules/mongoose/lib/document.js:1569:39)
في next_ (/Users/crispensmith/Documents/mongooseTest/node_modules/mongoose/node_modules/hooks-fixed/hooks.js:89:34)
في EventEmitter.fnWrapper (/ Users / crispensmith / Documents / mongooseTest / node_modules / mongoose / node_ modules / hooks-fix / hooks.js: 171: 15)
في EventEmitter.(/ Users / crispensmith / Documents / mongooseTest / node_modules / mongoose / node_ modules / mpromise / lib / prom.js: 175: 45)
في EventEmitter.emit (events.js: 98: 17)
في Promise.safeEmit (/Users/crispensmith/Documents/mongooseTest/node_modules/mongoose/node_modules/mpromise/lib/promise.js:81:21)
في Promise.fulfill (/Users/crispensmith/Documents/mongooseTest/node_modules/mongoose/node_modules/mpromise/lib/promise.js:94:24)
في p1.then.then.self.isNew (/Users/crispensmith/Documents/mongooseTest/node_modules/mongoose/lib/model.js:254:27)
في newTickHandler (/Users/crispensmith/Documents/mongooseTest/node_modules/mongoose/node_modules/mpromise/lib/promise.js:229:18)
في process._tickCallback (node.js: 442: 13)

(آسف ، لقد كنت أواجه وحشًا في الوقت الذي أدخل فيه هذا إلى تخفيض السعر المناسب ، هذا هو أفضل ما تمكنت من القيام به.)
وإليك ناتج mongoDB:

  > db.gh1204.find();
  { "_id" : ObjectId("5580d0c44d32b07971dfd281"), "sizes" : [ { "name" : "bacon", "_id" : ObjectId("5580d0c44d32b07971dfd282"), "lengths" : [ "25" ] } ], "measurements" : [ ], "__v" : 2 }

من منظور CRUD ، فإن جوهره هو أنه لا توجد مشكلة في الإنشاء أو القراءة ، ضع التحديثات تفشل.

TLDR ؛
في حالة الاستخدام الخاصة بي ، يعني هذا أنه بمجرد تحديد مجموعة من الأطوال للقياس ، لا يمكن تحريرها. أنا أعمل في مشروع بيع بالتجزئة للأزياء مع حالتين من حالات الاستخدام التي ستتطلب مصفوفات ضمن مستندات فرعية. حالات الاستخدام الأولى هي أن مستخدمي الفانيليا سيكون لديهم ملفهم الشخصي الخاص ، ويجب أن يكونوا قادرين على الحفاظ عليها. حالة الاستخدام الثانية هي أن دور المسؤول يمكنه إنشاء مخططات مخصصة لقوائم أنواع المنتجات المختلفة (قمم ، قيعان ، إلخ). لا أتوقع عادةً أن يحتاج ملف تعريف المسؤول إلى تعديل هذه المخططات الثانوية ولكن سيكون من الجيد أن يكون لديك في حالة الاستخدام هذه.

من الناحية النظرية ، تقدم الوظيفة الحالية في الواقع كائنًا لطيفًا (عرضيًا) غير قابل للتغيير ، لكن مقدار العمل المتضمن في استخدامه كجسم غير قابل للتغيير بدلاً من مجرد تحرير ليس بالأمر الهين.

أرى ما هي المشكلة - الحالة الكلاسيكية للسؤال الأول في الأسئلة الشائعة للنمس . لا يمكن لـ Mongoose تتبع التغييرات عند تعيين فهرس مصفوفة مباشرة بدون شيء مثل وكلاء ES6 أو ES7 Object.observe() . يستخدم

chart.sizes[0].lengths.set(0, "20");

أو

chart.sizes[0].lengths[0] = '20';
chart.markModified('sizes.0.lengths.0');

حسنًا ، هذا منطقي. الغريب ، (وقد يُعزى ذلك إلى استراتيجيات البحث الخاصة بي) كنت قادرًا فقط على العثور على الوظائف التي تعمل 1x لكل حفظ ، ولم يكن أي منها مناسبًا لحالة الاستخدام.

أرى ما هي المشكلة - الحالة الكلاسيكية للسؤال الأول في الأسئلة الشائعة للنمس.

شكرا ، لقد كانت هذه المشكلة في حالتي! :)

model.myArray[index] = anyValue

يصبح

model.myArray.set(index, anyValue)

كانت هذه أيضًا مشكلة بالنسبة لي ، أتمنى أن أرى هذا الموضوع عاجلاً!

إذا لم تكن متأكدًا من تلقي النمس إشعارًا بالتغييرات ، فيمكنك استخدام

doc.markModified('propChanged')
doc.save() // works

لقد قمت بحل مشكلتي مع Array.set () أيضًا.
: +1:

حصلت على نفس الخطأ ، هذا هو مقتطف الشفرة الخاص بي
image
وهذا هو سجل النمس
image
هذا ما حصلت عليه من ساعي البريد
image

اي شئ خاطئ؟

++ EDIT ++

  1. حاولت استخدام Array.set ، احصل على نفس النتيجة

أعتقد أن السؤال الأفضل هو ما إذا كان هناك أي شيء صحيح. أنت تقوم بحفظ غير متزامن في كتلة if (req.body.invite != []) ثم تقوم بتعديل المصفوفة invited في رد الاتصال الحل. ستحدث مكالمة nRoom.invited.push() دائمًا بعد مكالمة الحفظ الثانية (). أيضًا ، سيكون req.body.invite != [] صحيحًا دائمًا لأن [] == [] خطأ في JS.

@ vkarpov15 هههه طيب شكرا على الجواب! 👍 حصلت على الكثير من الأشياء لتتعلمها :)

@ peterkrieg شكرا!

مرحبًا ، أواجه هذه المشكلة عند تحديث المستندات المضمنة بعمق ، فهل لدى أي شخص أي نصيحة؟ الكود الخاص بي في:

https://stackoverflow.com/questions/51426326/updating-deeply-embedded-documents-with-mongodb-2-6-12

thehme ما هو إصدار النمس الذي تستخدمه؟

في هذا السطر ، {$set: {["dT." + index +".ts." + i + ".th"]: newValue}} ، تبدو الأقواس المربعة في غير مكانها بالنسبة لي. هل هناك فرق في استخدام {$set: { "dT." + index +".ts." + i + ".th": newValue } } بدلاً من ذلك؟

تعرض المستندات $ set مجرد سلسلة

لا تتردد في الانضمام إلينا على Gitter.im أو Slack للتحدث عنها في الوقت الفعلي 👍

أنا أستخدم 5.5.11 وما زلت أواجه هذه المشكلة. لقد جربت جميع الحلول المقترحة في هذا الموضوع دون أن يحالفني الحظ. يبدو تخطيط المستند الخاص بي كما يلي:

{
  myObj: {
    myArr: [{ key: "value" }]
  }
}

myDoc.myObj.myArr.push({ key: "value2" });
// debugging myDoc shows new embedded doc
await myDoc.save();
// console shows new embedded doc is gone

تحرير: تمت الترقية إلى أحدث إصدار (5.7.6) وما زالت المشكلة قائمة.

يعمل البرنامج النصي أدناه بشكل جيد على Mongoose 5.7.6. يرجى فتح مشكلة جديدة واتباع نموذج المشكلة.

const mongoose = require('mongoose');

run().catch(err => console.log(err));

async function run() {
  await mongoose.connect('mongodb://localhost:27017/test', {
    useNewUrlParser: true,
    useUnifiedTopology: true
  });
  await mongoose.connection.dropDatabase();

  const schema = mongoose.Schema({ 
    myObj: { myArr: [{ key: String }] }
  });
  const Model = mongoose.model('Test', schema);


  await Model.create({ myObj: { myArr: [{ key: 'value' }] } });
  const myDoc = await Model.findOne();

  myDoc.myObj.myArr.push({ key: "value2" });
  await myDoc.save();

  console.log(myDoc.myObj.myArr);

  const saved = await Model.findOne();
  console.log(myDoc.myObj.myArr);
}
هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات