Mongoose findOne eingebettetes Dokument von _id

Ich versuche, Menüs in das eingebettete Dokument zu schieben. Aber ich werde im Restaurant nicht findOne definiert. Ich möchte nur ein paar Dokumente in die Menü-Kategorien des Restaurants schieben. Wie Sie im Schema sehen können:

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 Antworten

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

Da MenuCategory nur ein Unterdokument von Restaurant ist, wird es beim Auffinden eines Restaurants bereits ausgefüllt sein. Z.B.

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

Beim Hinzufügen einer neuen Menükategorie muss eine neue MenuCategory -Instanz in das menuCategory -Array verschoben und das Restaurant gespeichert werden. Dies bedeutet, dass die neue Menükategorie im Restaurant gespeichert wird und nicht in einer separaten Sammlung. Beispielsweise:

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

Das Speichern eines Menüs in einer Menükategorie erfolgt auf dieselbe Weise, da Menüs nach Ihrem Schema in die Unterdokumente jeder Menükategorie eingebettet sind. Beachten Sie jedoch, dass Sie das Restaurant als die Restaurant-Sammlung speichern müssen, die alle Ihre Menüs und Menükategorien als Unterdokumente speichert

Nachdem ich Ihre Frage beantwortet habe (ich hoffe), sollte ich auch darauf hinweisen, dass Ihr Schemadesign überdacht werden sollte. Es ist wohl keine gute Idee, Subdokumente in Subdokumenten zu verschachteln. Ich denke, ich kann sehen, woher Sie kommen - Sie versuchen, eine SQL-ähnliche Viele-zu-Eins-Verknüpfung in Ihren Schemas zu implementieren. Bei NoSQL-Datenbanken ist das nicht nötig - das Denken ist etwas anders. Hier finden Sie einige Links zu einigen SO-Fragen zum effizienten Schemadesign mit NoSQL-Datenbanken:

0
hinzugefügt

Filialdokumente haben eine .id() -Methode, so dass Sie dies tun können:

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

Siehe http://mongoosejs.com/docs/subdocs.html als Referenz.

0
hinzugefügt