2016-01-24 10 views
10

Moodod ve fangozu kullanarak dizime bir öğe eklemek için $ itme özelliğini alamıyorum. Bunu çalıştırdıktan sonra, mongo kabuğunu kontrol ediyorum ve yeni eki orada yok. Ben yanlış yapıyorum Değil emin ne:Mongoose güncelleştirmesi devam ediyor

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

GÜNCELLEME: hala başarıyı olmamasından, tip alanı değiştirdikten sonra. Bu sefer sadece { $push: { pets: "sssss" } }'u zorlamaya çalışıyorum.

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 

cevap

2

gerçek nedeni pets dizisinde kullanılan type doğru olmadığıdır:

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

Burada asıl mongodb günlüğü olduğunu. Aslında, type, Schema Type işaretlemek için kullanılan mongoose anahtar kelimedir.

şema şu şekilde type1 için type değiştirirseniz

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

kurtardı pets Bu durumda Altında İlave _id

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

ile aşağıdaki gibi biz şu

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

Ve sonuç, burada:

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

Burada "$ push" kullanılmasının neden işe yaramadığını biliyor musunuz? Bir anahtar olarak 'tür' sorunlara neden olabileceğini okudum ama burada olan şeyin olduğunu düşünmüyorum. –

+0

@jackblank, benim test şemamda, tür String'dir, bu yüzden tüm nesne, nesne [object Object] 'nesne dizisi olarak diziye geçirilir. – zangw

3

. Bu benzer bir kod ve çalışıyor. findbyidandupdate, "yeni: true" isteğe bağlı param eklenmesini gerektirir. Aksi takdirde eski doktor size geri döner.

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