/ / Mongoose / MongoDB - aktualizácia čiastkového dokumentu nefunguje - javascript, polia, node.js, mongodb, mongoose

Mongoose / MongoDB - aktualizácia podponuky nefunguje - javascript, arrays, node.js, mongodb, mongoose

Nájdem taký vedľajší dokument:

var incidentId = "someID1"
var alerteeId  = "someID2"

Incident.findOneQ({ _id: someID1, "alertees._id": someID2 }, {"alertees.$": 1})
.then(function(incident) {
var alertee = incident.alertees[0];
alertee.responded_at = Date.now()
return alertee.parent().saveQ().then(function(alertee) {
console.log(alertee)
})
})

Správne nájde výstrahu. Ale keď aktualizujem, nepodarí sa mi uložiť upozornenie.

K tomu dôjde, iba ak pozícia výstrahy v poli NIE JE prvá. Je možné nájsť a aktualizovať prvého výstrahu v rade výstrah.

Čo robím zle?

odpovede:

1 pre odpoveď č. 1

Vaša syntax tu nie je „striktne“ mongooseová syntax, takže si nie ste istí, či implementujete ešte nejakú ďalšiu vrstvu.

Ale naozaj to, čo chcete, je .findOneAndUpdate() ako je uvedené v dokumentácii pre mongoose. V podstate to urobí celú vašu aktualizáciu v jednom hovore a vy to nazvete takto:

Incident.findOneAndUpdate(
{ "_id": someID1, "alertees._id": someID2 },
{ "alertees.$.responded_at": Date.now() },
function(err,incident) {
if (err) throw err;    // or do something like return the error

if ( incident != null ) {
incident.altertees.some(function(alertee) {
if ( alertee._id.toString() == someID2.toString() ) {
console.log( alertee );
return 1;
}
});
} else {
console.log( "not found" );
}
}
);

Toto je najefektívnejší formulár aktualizácie, ktorý vám vráti aj zmenený dokument. Pri spätnom volaní používam Pole # niektoré len aby zodpovedal „výstrahe“, ktorá bola aktualizovaná, a vráti sa tak, ako ste vy.

To samozrejme nevyžaduje žiadne metódy ani spojenia definované vo vašej schéme, ale len pre aktualizáciu dátumu je nepravdepodobné, že by ste to potrebovali. Ak môžete, môžete použiť .findOne() a .save() rovnako ako vy, ale porovnajte prvok poľa rovnako ako pred aktualizáciou.


Alebo ako úplnejší príklad:

var async = require("async"),
mongoose = require("mongoose"),
Schema = mongoose.Schema,
ObjectId = require("mongodb").ObjectID;

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

var alerteeSchema = new Schema({
"responded_at": Date
});

var incidentSchema = Schema({
alertees: [alerteeSchema]
});

var Incident = mongoose.model( "Incident", incidentSchema );

var incident = new Incident();

var date1 = new Date();
var date2 = new Date(
date1.valueOf() - ( date1.valueOf() % 1000 * 60 * 60 * 24 )
);

incident.alertees.push({ "responded_at": date1 });
incident.alertees.push({ "responded_at": date2 });

incident.save(function(err,incident) {

if (err) throw err;
var someID1 = incident._id;
var someID2 = incident.alertees[1]._id;
//var someID2 = new ObjectId();

console.log( "before: n" + incident );


Incident.findOneAndUpdate(
{ "_id": someID1, "alertees._id": someID2 },
{ "alertees.$.responded_at": Date.now() },
function(err,incident) {
if (err) throw err;

if (incident != null) {
incident.alertees.some(function(alertee) {
console.log( "test: " + alertee );
if ( alertee._id.toString() == someID2.toString() ) {
console.log( "after: n" + alertee );
return 1;
}
});
} else {
console.log( "not found" );
}
}
);

});

S týmito výsledkami:

before:
{ __v: 0,
_id: 53aba6c73b8d05ef77c2703b,
alertees:
[ { responded_at: Thu Jun 26 2014 14:51:19 GMT+1000 (EST),
_id: 53aba6c73b8d05ef77c2703c },
{ responded_at: Thu Jun 26 2014 08:58:31 GMT+1000 (EST),
_id: 53aba6c73b8d05ef77c2703d } ] }
test: { responded_at: Thu Jun 26 2014 14:51:19 GMT+1000 (EST),
_id: 53aba6c73b8d05ef77c2703c }
test: { responded_at: Thu Jun 26 2014 14:51:19 GMT+1000 (EST),
_id: 53aba6c73b8d05ef77c2703d }
after:
{ responded_at: Thu Jun 26 2014 14:51:19 GMT+1000 (EST),
_id: 53aba6c73b8d05ef77c2703d }