【问题标题】:Mongoose findOne embedded document by _idMongoose findOne 由_id 嵌入的文档
【发布时间】:2014-01-04 22:02:36
【问题描述】:

我正在尝试将菜单推送到嵌入式文档。但我没有在餐厅定义 findOne。我只想将一些文件推送到餐厅的菜单类别中。正如您在架构中看到的:

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

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    子文档有一个 .id() 方法,所以你可以这样做:

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

    请参阅http://mongoosejs.com/docs/subdocs.html 以供参考。

    【讨论】:

      【解决方案2】:

      restaurant 只是一个包含查询结果的对象。它没有 findOne 方法,只有 Restaurant 有。

      由于MenuCategory 只是Restaurant 的子文档,因此每当您检索餐厅时都会预先填充此内容。例如

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

      添加新的菜单类别是将新的MenuCategory 实例推送到menuCategory 数组并保存餐厅。这意味着新的菜单类别与餐厅一起保存,而不是单独的集合。例如:

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

      将菜单保存到菜单类别遵循相同的过程,因为根据您的架构,菜单是每个 MenuCategory 中的嵌入子文档。但请注意,您需要将 restaurant 保存为它的餐厅集合,该集合将所有菜单和菜单类别存储为子文档

      在回答了您的问题后(​​我希望),我还应该指出您的架构设计应该重新考虑。将子文档嵌套在子文档中可能不是一个好主意。我想我可以看到你来自哪里——你正试图在你的模式中实现一个类似 SQL 的多对一关联。但是对于 NoSQL 数据库,这不是必需的 - 想法有些不同。以下是一些关于使用 NoSQL 数据库进行高效模式设计的 SO 问题的链接:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-31
        • 1970-01-01
        • 2018-07-07
        • 2016-02-23
        • 2020-11-12
        • 1970-01-01
        • 2015-07-17
        • 2012-02-18
        相关资源
        最近更新 更多