Mongoose: Model.save() рдПрдореНрдмреЗрдбреЗрдб рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рд╕рд╣реЗрдЬрддрд╛ рдирд╣реАрдВ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 10 рдирд╡ре░ 2012  ┬╖  26рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: Automattic/mongoose

рдореЗрд░реЗ рдкрд╛рд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреА рдиреЗрд╕реНрдЯреЗрдб рд╕рд░рдгрд┐рдпрд╛рдБ рд╣реИрдВ, рдФрд░ рдЬрдм рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдмрджрд▓рддрд╛ рд╣реВрдБ рдФрд░ рдореЙрдбрд▓ рдкрд░ .save() рдХрд░рддрд╛ рд╣реВрдБ рддреЛ рдпрд╣ рдиреЗрд╕реНрдЯреЗрдб рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд╕рд╣реЗрдЬрддрд╛ рдирд╣реАрдВ рд╣реИред

рдпрд╣рд╛рдБ рдореЗрд░реЗ рдореЙрдбрд▓ рдФрд░ рд╕реНрдХреАрдорд╛ рд╣реИрдВ (рдХреБрдЫ рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝реЗ рдЧрдП):

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);

рдЗрд╡реЗрдВрдЯ рд╕реЗ рдкрд╣рд▓реЗ рдореЙрдбрд▓ред рд╕реЗрд╡ () рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ:

{ 
     __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

рдореИрдВрдиреЗ рд╢реАрд░реНрд╖-рд╕реНрддрд░реАрдп рдИрд╡реЗрдВрдЯ (рдХрд╛рдо рдХрд░ рд░рд╣реЗ) рдореЗрдВ рдПрдХ рд╡реЛрдЯ рд╕рд╣реЗрдЬрдирд╛ рдФрд░ рд╕рд╛рде рд╣реА рдЗрд╕реЗ рдПрдХ рдиреЗрд╕реНрдЯреЗрдб рдИрд╡реЗрдВрдЯ (рдХрд╛рдо рдирд╣реАрдВ рдХрд░рдирд╛) рдореЗрдВ рд╕рд╣реЗрдЬрдирд╛ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╡реЗ рд╡реЛрдЯ рдЬреЛрдбрд╝рдиреЗ рдпрд╛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдФрд░ рдлрд┐рд░ рдЙрд╕реЗ рдЙрд╕реА рддрд░рд╣ рд╕реЗрд╡ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВред

suggestions рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдЕрдкрдиреЗ EventSchema рд░реЗрдлрд░реА рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:

// 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() рдПрдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдиреЗ рдПрдореНрдмреЗрдбреЗрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЛрдВрдЧреЛрдбрдм рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдирд╣реАрдВ рдЧрдпрд╛ рд╣реИред рдХреГрдкрдпрд╛ рдЗрд╕ рдкрд░ рдореЗрд░реА рд╕рд╣рд╛рдпрддрд╛ рдХрд░реЗрдВред

@ рдордиреЛрдЬрдХреБрдорд╛рд░ 91 рдХреНрдпрд╛ рдЖрдк рдХреБрдЫ рдХреЛрдб рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕реЗ рдкреБрди: рдкреЗрд╢ рдХрд░рддрд╛ рд╣реИ? рдмрд╣реБрдд рдорджрджрдЧрд╛рд░ рд╣реЛрдЧрд╛ :)

рдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рднреА рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ рд╣реИ, рдпрд╣рд╛рдБ рдореЗрд░рд╛ рдореЙрдбрд▓ рд╣реИ:

/*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();
    }
  };

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЛ рдЪрд▓рд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдорд╛рдк рдФрд░ рдЖрдХрд╛рд░ рдХреЗ 2 рдЖрдпрд╛рдореА рд╕рд░рдгреА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рд░рд╛рдЬреНрдп-рдирд┐рд░реНрднрд░ рдкреНрд░рдкрддреНрд░ рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рддрддреНрд╡реЛрдВ рдХреА рдЗрд╕ рд╕реВрдЪреА рдХреЛ рдЕрджреНрдпрддрди рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рдбрдореА рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рд╡рд░реНрддрдорд╛рди рдбрдореА рдЪрд╛рд░реНрдЯ (рдХрдВрд╕реЛрд▓ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛) рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

> 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 }

рдореИрдВрдиреЗ рд╕рд╣реЗрдЬрдиреЗ рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдЖрдХрд╛рд░ рд╕рд░рдгреА рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рд╣реИ, рдЖрдХрд╛рд░ [0] рд▓рдВрдмрд╛рдИ [0] рд╕реНрд▓реЙрдЯ рдореЗрдВ "1111" рдХрд╛ рдЗрдирдкреБрдЯ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдиреЛрдб рдореЗрдВ рдирд┐рд░реАрдХреНрд╖рдг рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реЗрд╡ рдмрд┐рд▓реНрдХреБрд▓ рд╡рд╛рдкрд╕ рдЖ рд░рд╣рд╛ рд╣реИ рдкреНрд░реА-рд╕реЗрд╡ рдХреЗ рд╕рдорд╛рди рдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ред

рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдкрдХреЛ рдХрд┐рд╕реА рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рд╡рд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

@ рдХреНрд░рд┐рд╕реНрдкреЗрди-рд╕реНрдорд┐рде рдореБрдЭреЗ рдХреБрдЫ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдореЗрд░реЗ рд▓рд┐рдП рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдордЭрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдХреЛрдб рд╣реИред рдХреНрдпрд╛ рдЖрдк 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' } } {} 

рдФрд░, рдХреЗрд╡рд▓ рд╕рд░рдгреА рдХреЗ рдЕрдВрджрд░ рдПрдХ рдЪрд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде:

рдиреЗрд╡рд▓рд╛: рдЪрд╛рд░реНрдЯ.рдлрд╛рдЗрдВрдбрдСрди ({рдирд╛рдо: 'рдорд╛рдк рдХреЗ рд╕рд╛рде рдЪрд╛рд░реНрдЯ'}) {рдлрд╝реАрд▓реНрдб: рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд}
(рд╣рд╛рдБ, рдмрд╕ рдЗрддрдирд╛ рд╣реА... рдХреЛрдИ рдЕрджреНрдпрддрди рдХреНрд╡реЗрд░реА рдирд╣реАрдВ)

рдореИрдВ рд╣рд░ рдмрд╛рд░ рдкреВрд░реЗ рдЙрдк-рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рд╣рдЯрд╛рдХрд░ рдЗрд╕реЗ рдкреИрдЪ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдБ, рдХрдо рд╕реЗ рдХрдо рдЗрд╕ рд╕рдордп рдХреЗ рд▓рд┐рдП... рдореБрдЭреЗ рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрднрд╛рддреНрдордХ рдЕрдЦрдВрдбрддрд╛ рдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрдИрдбреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

--рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ--
рдореИрдВрдиреЗ рд╣рдЯрд╛рдиреЗ рдФрд░ рдкреБрдирдГ рд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред рдЬрдмрдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕ рдЯреБрдХрдбрд╝реЗ рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрдкреБрдЯ рдЯреНрд░реЗрд╕ рдирд╣реАрдВ рд╣реИ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдбрд┐рд▓реАрдЯ рдмреИрдХ-рдПрдВрдб рдСрдкрд░реЗрд╢рди рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдХреНрдпрд╛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдЧрдВрджреА-рдЬрд╛рдВрдЪ рд╣реИ рдЬрд┐рд╕реЗ рдЯреНрд░рд┐рдЧрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ?

рдЙрдкрд░реЛрдХреНрдд рдореЗрд░реЗ рдиреЛрдЯреНрд╕ рджрд┐рдП рдЧрдП рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдиреЗ рдХрд╛ рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк?

@ рдХреНрд░рд┐рд╕реНрдкреЗрди-рд╕реНрдорд┐рде рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдПрдХ рд╕реНрдЯреИрдВрдбрдЕрд▓реЛрди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдХрд╛ рдореЗрд░рд╛ рдореВрд▓ рдкреНрд░рдпрд╛рд╕ рд╣реИ:

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.ended && !this.hasRejectListeners()) рдереНрд░реЛ рдХрд╛рд░рдг;
^
рдЕрднрд┐рдХрдерди рддреНрд░реБрдЯрд┐: "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_ рдореЙрдбреНрдпреВрд▓/рд╣реБрдХ-рдлрд┐рдХреНрд╕реНрдб/рд╣реБрдХ.рдЬреЗрдПрд╕:171:15) рдкрд░
EventEmitter рдкрд░ред(/Users/crispensmith/Documents/mongooseTest/node_modules/mongoose/node_ рдореЙрдбреНрдпреВрд▓реНрд╕/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)
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)
рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░._рдЯрд┐рдХ рдХреЙрд▓рдмреИрдХ (рдиреЛрдб.рдЬреЗрдПрд╕:442:13)

(рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдЗрд╕реЗ рдЙрдЪрд┐рдд рдорд╛рд░реНрдХрдбрд╛рдЙрди рдореЗрдВ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдордп рдХрд╛ рдЬрд╛рдирд╡рд░ рд░рд╣рд╛ рд╣реИ, рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ рдЬреЛ рдореИрдВ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред)
рдФрд░ рдпрд╣рд╛рдБ рдореЛрдВрдЧреЛрдбреАрдмреА рдЖрдЙрдЯрдкреБрдЯ рд╣реИ:

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

CRUD рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдЗрд╕рдХрд╛ рд╕рд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдХреНрд░рд┐рдПрдЯ рдпрд╛ рд░реАрдбреНрд╕ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рдкреБрдЯ рдЕрдкрдбреЗрдЯреНрд╕ рд╡рд┐рдлрд▓ рд╣реЛ рд░рд╣реЗ рд╣реИрдВред

рдЯреАрдПрд▓рдбреАрдЖрд░;
рдореЗрд░реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдПрдХ рдмрд╛рд░ рдорд╛рдк рдХреЗ рд▓рд┐рдП рд▓рдВрдмрд╛рдИ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЙрдиреНрд╣реЗрдВ рд╕рдВрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рджреЛ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдлреИрд╢рди рдЦреБрджрд░рд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЙрдк-рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреЗ рднреАрддрд░ рд╕рд░рдгреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдкрд╣рд▓реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗрдирд┐рд▓рд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рдЕрдкрдиреА рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рд╣реЛрдЧреА, рдФрд░ рдЗрдиреНрд╣реЗрдВ рдмрдирд╛рдП рд░рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рджреВрд╕рд░рд╛ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рднреВрдорд┐рдХрд╛ рд╡рд┐рднрд┐рдиреНрди рдЙрддреНрдкрд╛рдж рдкреНрд░рдХрд╛рд░реЛрдВ (рд╢реАрд░реНрд╖, рдиреАрдЪреЗ рдЖрджрд┐) рдХреЗ рд▓рд┐рдП рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдо рдЪрд╛рд░реНрдЯ рдмрдирд╛ рд╕рдХрддреА рд╣реИред рдореИрдВ рдЖрдорддреМрд░ рдкрд░ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рд╕реЗ рдЗрди рджреНрд╡рд┐рддреАрдпрдХ рдЪрд╛рд░реНрдЯреЛрдВ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░рддрд╛, рд▓реЗрдХрд┐рди рдЙрд╕ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрднреА рднреА рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫреА (рдЖрдХрд╕реНрдорд┐рдХ) рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╡рд╕реНрддреБ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХреЗрд╡рд▓ рд╕рдВрдкрд╛рджрди рдХреЗ рдмрдЬрд╛рдп рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд╛рд░реНрдп рдХреА рдорд╛рддреНрд░рд╛ рдЧреИрд░-рддреБрдЪреНрдЫ рд╣реИред

рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рдореБрджреНрджрд╛ рдХреНрдпрд╛ рд╣реИ - рдиреЗрд╡рд▓рд╛ рдкрд░ рдкрд╣рд▓реЗ рдкреНрд░рд╢реНрди рдХрд╛ рдХреНрд▓рд╛рд╕рд┐рдХ рдорд╛рдорд▓рд╛ 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

рдХреБрдЫ рдЧрд╝рд▓рдд рд╣реИ?

++ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ ++

  1. Array.set рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛, рд╡рд╣реА рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмреЗрд╣рддрд░ рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХреБрдЫ рд╕рд╣реА рд╣реИред рдЖрдк if (req.body.invite != []) рдмреНрд▓реЙрдХ рдореЗрдВ рдПрдХ рдПрд╕рд┐рдВрдХ рд╕реЗрд╡ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рд╕рдВрдХрд▓реНрдк рдХреЙрд▓рдмреИрдХ рдореЗрдВ invited рд╕рд░рдгреА рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред nRoom.invited.push() рдХреЙрд▓ рд╣рдореЗрд╢рд╛ рджреВрд╕рд░реА рд╕реЗрд╡() рдХреЙрд▓ рдХреЗ рдмрд╛рдж рд╣реЛрдЧреАред рд╕рд╛рде рд╣реА, req.body.invite != [] рд╣рдореЗрд╢рд╛ рд╕рддреНрдп рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЬреЗрдПрд╕ рдореЗрдВ [] == [] рдЧрд▓рдд рд╣реИред

@ 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 } } рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдкрдбрд╝рддрд╛ рд╣реИ?

$рд╕реЗрдЯ рдбреЙрдХреНрд╕ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ

рдкрд░ рд╣рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд▓рдЧ рд░рд╣рд╛ рд╣реИ Gitter.im рдпрд╛ рд╕реБрд╕реНрдд рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ЁЯСН

рдореИрдВ 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) рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рдФрд░ рдЕрднреА рднреА рд╕рдорд╕реНрдпрд╛ рд╣реИред

рдиреАрдЪреЗ рджреА рдЧрдИ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдиреЗрд╡рд▓рд╛ 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 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

ArThoX picture ArThoX  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jeremyml picture jeremyml  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

lukasz-zak picture lukasz-zak  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Soviut picture Soviut  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

adamreisnz picture adamreisnz  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ