2013-02-20 13 views
8

Próbuję zaktualizować dokument w MongoDB, znajdując go w ObjectId. Przepływ pracy jest następujący (dotyczy bloga).Wyszukiwanie dokumentu MongoDB za pomocą ObjectId z Mongoose

  1. Utwórz nowy wpis w MongoDB, przekazując tytuł i treść. ObjectId jest tworzone automatycznie.
  2. Przejdź do edycji postu. Używa ObjectId z adresu URL, aby pobrać go z bazy danych i wyświetlić go w tym samym nowym formularzu, tylko z wcześniejszymi wartościami.
  3. Po kliknięciu przycisku Wyślij chcę znaleźć dokument w ObjectId i zaktualizować wartości w bazie danych do wartości w formularzu wpisu.

Krok 1 & 2 działa dobrze, ale krok 3 wydaje się nie działać. Przekierowuje na stronę, której potrzebuję. Ale baza danych nie została zaktualizowana. Jest to ta sama wartość, co wcześniej.

Oto odpowiedni kod dla części Aktualizacja postu:

app.js

app.post "/office/post/:id/update", ensureAuthenticated, routes.updatePost 

szlaki/index.js

mongoose = require 'mongoose' 
ObjectId = mongoose.Types.ObjectId 

Post = require '../models/Post' 

... 

updatePost: function(req, res) { 
    var o_id, the_id; 

    the_id = req.params.id; 
    console.log(the_id); // 510e05114e2fd6ce61000001 

    o_id = ObjectId.fromString(the_id); 
    console.log(o_id); // 510e05114e2fd6ce61000001 

    return Post.update({ 
    "_id": ObjectId.fromString(the_id) 
    }, { 
    "title": "CHANGE" 
    }, res.redirect("/office/edit/posts")); 
} 

Używam Express i Mangusta.

Jest to również model poczta czy to pomaga:

(function() { 
    var Post, Schema, mongoose; 

    mongoose = require('mongoose'); 

    Schema = mongoose.Schema; 

    Post = new Schema({ 
    title: String, 
    subhead: String, 
    body: String, 
    publish_date: { 
     type: Date, 
     "default": Date.now 
    }, 
    mod_date: { 
     type: Date, 
     "default": Date.now 
    } 
    }); 

    module.exports = mongoose.model('Post', Post); 

}).call(this); 

A oto kod dla widoku edycji blogu:

app.js

app.get("/office/post/:id/edit", ensureAuthenticated, routes.editPost); 

tras /index.js

editPost: function(req, res) { 
    return Post.findById(req.params.id, function(err, post) { 
    return res.render('edit-post', { 
     post: post, 
     title: post.title 
    }); 
    }); 
} 

Odpowiedz

3

Problemem jest to, jak się nazywają update

return Post.update({ 
    "_id": ObjectId.fromString(the_id) 
}, { 
    "title": "CHANGE" 
}, res.redirect("/office/edit/posts")); 

Ostatni argument rzeczywiście przekierować stronę, natomiast update oczekuje funkcja do wywołania kiedy zakończeniu aktualizacji

Należy zdać w

return Post.update({ 
    "_id": ObjectId.fromString(the_id) 
}, { 
    "title": "CHANGE" 
}, function(err, model) { 
    if (err) // handleerr 

    res.redirect("/office/edit/posts")); 
}); 

W ten sposób przekierowujemy tylko po pomyślnym zaktualizowaniu modelu

+0

To wszystko, dzięki! Chociaż dla innych, musiałem również zmienić sposób, w jaki odwoływałem się do _id. Oto ostatni kod dla updatePost: 'updatePost: function (req, res) { return Post.update ({ " _id ": req.params.id }, req.body.post, funkcja (err, post) { if (err) { console.log ("Błąd"); } powróć res.przekierowanie ("/ office/edit/posts"); }); } ' –

Powiązane problemy