Mongoose findOne documento incrustado por _id

Estoy tratando de insertar menús en el documento incrustado. Pero no estoy definiendo findOne en el restaurante. Solo quiero insertar algunos documentos en las categorías de menú del restaurante. Como puedes ver en el esquema:

var RestaurantSchema = new mongoose.Schema({
    contactTelphone : String,
    address : String,
    branchID : String,
    email : String,
    restaurantName : String,
    userID : String,
    menuCategory : [MenuCategorySchema]
});

var MenuCategorySchema = new mongoose.Schema({
    menuCategory : String,
    menuCategoryAlt : String,
    sequence : Number,
    menus : [MenuSchema],
    restaurantInfo : { type: Schema.Types.ObjectId, ref: 'Restaurant' },
});

var MenuSchema = new mongoose.Schema({
    foodName : String,
    foodNameAlt : String,
    picName : String,
    price : String,
    rating : Number,
    menuSequence : Number,
    category : { type: Schema.Types.ObjectId, ref: 'MenuCategory' },
});

exports.menuForMenuCategory = function(newData, callback)
{
    console.log(newData);

    var menuCategoryId = newData.menuCategoryId;
    var restaurantId = newData.restaurantId;

    var newMenu = new Menu({
        foodName : newData.foodName,
        foodNameAlt : newData.foodNameAlt,
        picName : newData.picName,
        price : newData.price,
        cookingCategory : newCookingCategory,
        dishSpecial : newDishSpeical
    });

    Restaurant.findOne( {'_id' : restaurantId }, function(err, restaurant){
        if (!err) {
                    //Is it how to do this? It says "findOne not defined"
            restaurant.findOne( "_id" : menuCategoryId, function(err, category){
                category.push(newMenu);
            });
        }
    });
}
0

2 Respuestas

restaurant is just an object containing the result to your query. It does not have a findOne method, only Restaurant does.

Dado que, MenuCategory es solo un subdocumento de Restaurant , esto se rellena previamente cada vez que recupera un restaurante. P.ej.

Restaurant.findById(restaurantId, function(err, restaurant){
    console.log(restaurant.menuCategory);  
   //Will show your array of Menu Categories
   //No further queries required
});

Agregar una nueva Categoría de menú es una cuestión de empujar una nueva instancia de MenuCategory a la matriz menuCategory y guardar el restaurante. Esto significa que la nueva categoría del menú se guarda con el restaurante y no en una colección separada. Por ejemplo:

Restaurant.findById(restaurantId, function(err, restaurant){
   //I'm assuming your Menu Category model is just MenuCategory
    var anotherMenuCategory = new MenuCategory({
        menuCategory: "The name",
        menuCategoryAlt: "Alternative name",
        sequence: 42,
        menus: []
    });
    restaurant.menuCategory.push(anotherMenuCategory);
    restaurant.save();//This will save the new Menu Category in your restaurant
});

Guardar un menú en una categoría de menú sigue el mismo procedimiento ya que, de acuerdo con su esquema, los Menús son sub-documentos incrustados dentro de cada Categoría de menú. Pero tenga en cuenta que debe guardar el restaurante ya que es la colección de restaurantes que almacena todos sus menús y categorías de menú como documentos secundarios.

Después de haber respondido a su pregunta (espero) también debo señalar que su diseño del esquema debe ser repensado. Tener sub-documentos anidados dentro de sub-documentos podría decirse que no es una buena idea. Creo que puedo ver de dónde vienes: estás tratando de implementar una asociación muchos a uno similar a SQL dentro de tus esquemas. Pero esto no es necesario con las bases de datos NoSQL; el pensamiento es algo diferente. Aquí hay algunos enlaces a algunas preguntas sobre SO sobre el diseño eficiente de esquemas con bases de datos NoSQL:

0
agregado

Los subdocumentos tienen un método .id() para que pueda hacer esto:

myModel.findById(myDocumentId, function (err, myDocument) {
  var subDocument = myDocument.mySubdocuments.id(mySubDocumentId);
});

Consulte http://mongoosejs.com/docs/subdocs.html como referencia.

0
agregado