Обновление Mongoose не сохраняется

Используя mongodb и mongoose, я не могу получить $push, чтобы добавить элемент в мой массив. После того, как я запустил это, я проверяю оболочку mongo, и новое приложение не существует. Не уверен, что я делаю неправильно:

UserModel.findOne({ firstName: "bob" }, 'pets', function(err, user) {
  UserModel.update(user, {
    $push: {
      pets: {
          name: "pear", type: "pig"  
      }
    }
  }, function(err, numAffected, raw) {
      if (err) console.log(err);
      console.log('updated ' + JSON.stringify(numAffected));
  });
});

Mongoose: users.ensureIndex({ username: 1 }) { unique: true, background: true }  
Mongoose: users.findOne({ firstName: 'bob' }) { fields: { pets: 1 } }  
Mongoose: users.update({ pets: [ { type: 'dog', name: 'apple' }, { type: 'cat', name: 'felix' } ], _id: ObjectId("56a53d45a428cbde3c4299f8") }) { '$push': { pets: { name: 'pear', type: 'pig' } } } {} 
updated {"ok":1,"nModified":0,"n":0}

> bob = db.users.find()[0]
{
    "_id" : ObjectId("56a53d45a428cbde3c4299f8"),
    "firstName" : "bob",
    "lastName" : "smith",
    "username" : "bob123",
    "pets" : [
        {
            "name" : "apple",
            "type" : "dog"
        },
        {
            "name" : "felix",
            "type" : "cat"
        }
    ],
    "__v" : 0
}
> 

UPDATE: После изменения поля типа все еще не имеет успеха. На этот раз я просто пытаюсь нажать { $push: { pets: "sssss" } }.

UserModel.findOne({ firstName: "bob" }, 'pets', function(err, user) {
  UserModel.update(user,
    { $push: { pets: "sssss" }},
    function(err, numAffected, raw) {
      if (err) console.log(err);
      console.log('updated ' + JSON.stringify(numAffected));
  });
});

Вот фактический журнал mongodb:

2016-01-29T03:14:37.030+0000 I COMMAND  [conn17] command curves.$cmd command: update { update: "users", updates: [ { q: { pets: [ { petType: "pig", name: "pear" } ], _id: ObjectId('56aad0a3ef5848c231ec80ed') }, u: { $push: { pets: "sssss" } }, upsert: false, multi: false } ], ordered: true, writeConcern: { w: 1 } } ntoskip:0 keyUpdates:0 writeConflicts:0 numYields:0 reslen:55 locks:{ Global: { acquireCount: { r: 1, w: 1 } }, Database: { acquireCount: { w: 1 } }, Collection: { acquireCount: { w: 1 } } } protocol:op_query 0ms

Ответ 1

Настоящая причина в том, что type, используемый в массиве pets, неверен. На самом деле type - это одно ключевое слово mongoose, которое используется для отметки Schema Type.

Если изменить type на type1 следующим образом:

var UserSchema = new mongoose.Schema({
    // ....
    pets: [{name: String, type1: String}],
});

Сохраненный pets должен соответствовать следующим _id

"pets" : [
    {
        "name" : "o3",
        "type1" : "t3",
        "_id" : ObjectId("56a5df9adea3071b0de83407")
    },

В этом случае мы можем сделать следующее

UserModel.findOne({ firstName: "bob" }, 'pets', function(err, user) {
  UserModel.update(user, {
    $push: {
      pets: {
          name: "pear", type1: "pig"  
      }
    }
  }, function(err, numAffected, raw) {

И результат

"pets" : [
    {
        "name" : "o3",
        "type1" : "t3",
        "_id" : ObjectId("56a5df9adea3071b0de83407")
    },
    {
        "type1" : "pig",
        "name" : "pear",
        "_id" : ObjectId("56a5dff3a648301d0db118df")
    }
],

Ответ 2

Здесь. Это аналогичный код, и он работает. findbyidandupdate должен быть добавлен дополнительный параметр "new: true" . В противном случае вы вернете старый документ.

var express = require("express");
var app = express();
var mongoose = require("mongoose");

mongoose.connect("mongodb://localhost/population");

var db = mongoose.connection;

db.on("error", console.error.bind(console, "connection error:"));
db.once("open", function(){
    var mongoose = require("mongoose");

    var userSchema = new mongoose.Schema({
        firstname : String,
        lastname : String,
        pets : []
    })
    var userModel = mongoose.model("User", userSchema);

    var bob = new userModel({
        "firstname" :"bob",
        "lastname" : "Smith",
        "pets" : [
            {name : "apple", type : "dog"},
            {name : "felix", type : "cat"}
        ]
    })

    bob.save(bob, function(err, user){
        console.log(user)
    });

  userModel.findOneAndUpdate(
        {firstname : "bob"}, 
        {$push : {"pets" : {name : "pear", type : "pig"}}},
         //THE MOST IMPORTANT PART ADD new : true
        {safe : true, upsert : true, new : true},
        function(err, model){
            console.log(model);
        }
  )

})//once


app.listen(3000, function(){
    console.log("listening on port: " , 3000)
})