2014-10-08 20 views
6

Ben kullanıcılar için bu küçük şema vardır:Gelincik silmek alt belge dizi öğesi

{ 
username: String, 
contacts: Array 
} 

Yani bu gibi görünecektir bazı kullanıcının kontakları örneğin:

{ 
username: "user", 
contacts: [{'id': ObjectId('525.....etc'), 'approved': false}, {'id':ObjectId('534.....etc'), 'approved': true}] 
} 

Şimdi bir öğeyi silmek gerek kişilerden yüzden yapın:

model.findByIdAndUpdate(23, {'$pull': { 
       'contacts':{'id':'525.....etc'} 
       }}); 

ama çalışmıyor görünüyor, n o hataları ama silinir gelmez , sadece kullanıcı için bu belgeyi dönmek istiyorum:

{ 
    username: "user", 
    contacts: [{'id':ObjectId('534.....etc'), 'approved': false}] 
    } 

nasıl bunu başarmak için?

cevap

10

Yalnızca $pull işleci, yalnızca üzerinde çalıştığı dizi öğesindeki koşulları gerçekleştirir. Sorunuz, muhtemelen, tüm dizi alanları için varsayılan olarak mongoose'un oluşturduğu ObjectId değeriyle çalıştığınızı göstermeyebilir.

Yani ObjectId oluşturma yöntemini aktardıktan sonra, böyle sorgunuzla olabilir:

model.findByIdAndUpdate(23, { 
    '$pull': { 
     'contacts':{ '_id': new ObjectId(someStringValue) } 
    } 
}); 

Ya aslında aslında biraz daha iyi "şema" tanımlayabilir ve firavunfaresi olacak aslında "AutoCast" sizin için Nesne Kimliği şemada tanımlanan "tip" dayalı:

var contactSchema = new Schema({ 
    approved: Boolean 
}); 

var userSchema = new Schema({ 
    username: String, 
    contacts: [contactSchema] 
}); 

Bu kesinlikle yazdığınız alan tanımları için "kuralları takip" için mongoose verir. Yani şimdi 'u bildiğinizi ve her bir element dizisi için bir _id alanınızın olduğunu ve bu alanın "türünün" aslında bir ObjectId olduğunu, böylece otomatik olarak "String" değerlerinin gerçek bir ObjectId olarak sağlandığını döndürecek.

+0

hi teşekkürler ama şimdi ben bu hata var: ** [MongoError: istisna: [{id:: Nesne ('543394bb964ac60915ceba8b' elemanını ({kişiler travers parçayı (contacts.id kontaklarını) kullanamazsınız), onaylandı: false}, {id: ObjectId ('543399f9964ac60915ceba8c'), onaylandı: false}]}) ** bu ne olabilir? ben senin nokta açıklamalarını kullandım - – sbaaaang

+0

@sbaaaang Aslında ne yapıyorsun? Size söylendiği gibi "nokta notasyonu" formunu kullanıyor musunuz? BTW Gerçek verilerinizin, muhtemelen burada yine sorunun bir parçası olan, yayınladığınızdan farklı olduğunu açıkça gösterdiğiniz için teşekkür ederiz. Gerçek veri yapınızı göstermek için lütfen düzenleyin. –

+0

evet kullanarak * nokta notasyonu * dediğin gibi evet, ObjectIds kullanarak im ama sanırım sorun değil: P nope? (düzenlenmiş soru) – sbaaaang

1

finaly!

MongoDB: 

"imgs" : {"other" : [ { 
     "crop" : "../uploads/584251f58148e3150fa5c1a7/photo_2016-11-09_21-38-55.jpg", 
     "origin" : "../uploads/584251f58148e3150fa5c1a7/o-photo_2016-11-09_21-38-55.jpg", 
     "_id" : ObjectId("58433bdcf75adf27cb1e8608") 
            } 
          ] 
        }, 
router.get('/obj/:id', function(req, res) { 
var id = req.params.id; 



Model.findOne({'imgs.other._id': id}, function (err, result) { 
     result.imgs.other.id(id).remove(); 
     result.save();    
    }); 
İlgili konular