2014-09-19 2 views
0

У меня есть приложение запаса, где я хочу установить некоторые сведения о запасе, а затем вставить все элементы запаса. Я хочу вставить данные о запасе и элементы в двух разных коллекциях, чтобы затем я мог фильтровать элементы. Я использую MEAN стек, где я модифицировал модуль Crud принять некоторые дополнительные поля, а также сделал пользовательский интерфейс для заполнения пунктов array.This то, что я до сих пор:Одновременно сохраняйте два ссылочных документа

scope.stockItems = []; 

    $scope.createStockItem = function() { 
     $scope.stockItems.push(
      { 
       brand: $scope.brand, 
       style: $scope.style, 
       amount: $scope.amount 
      } 
     ); 

     $scope.brand = false; 
     $scope.style = false; 
     $scope.amount = ''; 
    }; 

    // Create new Stock 
    $scope.create = function() { 
     // Create new Stock object 
     var stock = new Stocks ({ 
      name: this.name, 
      details: this.details, 
      stockDate: this.stockDate 
     }); 

     // Redirect after save 
     stock.$save(function(response) { 
      $location.path('stocks/' + response._id); 

      // Clear form fields 
      $scope.name = ''; 
     }, function(errorResponse) { 
      $scope.error = errorResponse.data.message; 
     }); 
    }; 

Штока модель:

var StockSchema = new Schema({ 
name: { 
    type: String, 
    default: '', 
    required: 'Please fill Stock name', 
    trim: true 
}, 
details: { 
    type: String, 
    default: '', 
    required: 'Please fill Stock details' 
}, 
stockDate: Date 
created: { 
    type: Date, 
    default: Date.now 
}, 
user: { 
    type: Schema.ObjectId, 
    ref: 'User' 
} 
}); 

и метод в контроллере сервера:

exports.create = function(req, res) { 
var stock = new Stock(req.body); 

stock.user = req.user; 

stock.save(function(err) { 
    if (err) { 
     return res.status(400).send({ 
      message: errorHandler.getErrorMessage(err) 
     }); 
    } else { 
     res.jsonp(stock); 
    } 
}); 
}; 

Как я могу отправить в запрос и сохранить stockItems также?

ответ

0

Говоря «одновременно», я думаю, вам нужна функция транзакции, которая действительно является RDBMS и не поддерживается MongoDB. Если ваше приложение сильно полагается на такие функции, я боюсь, что MongoDB не подходит для вас.

Итак, вернемся к вашему вопросу, я не понимаю, почему вы должны хранить stock и stock item в 2 разных коллекциях. Хранить их в одной коллекции было бы лучше. Для получения дополнительной информации вы можете обратиться к руководству MongoDB от Data Model Design. Если это всего лишь фильтрация всех предметов запаса, то для этой цели предназначен aggregation framework. Также как Map/Reduce. Здесь структура агрегации лучше подходит для вашей проблемы. У вас было бы что-то вроде:

db.stock.aggregate([ 
    {$match: {...}}, // same as find criteria. to narrow down data range 
    {$unwind: "$items"}, // unwind items. 
    ... // probably some other $match to filter the items 
]); 
+0

так что я могу использовать денормализованную модель данных и вставлять элементы stockItems внутри Stocks. Но используя эту модель, я могу запросить forr все красные акции из всех акций? –

+0

@FacuFerrari Да, я имею в виду, что вы можете хранить элементы запаса во встроенном документе, чтобы при их сохранении он был атомарным. Я действительно не знаю, как вы собираетесь запрашивать «red StockItems». У вас есть еще одна коллекция запасов предметов, и каждая запись представляет собой запас определенного предмета? – yaoxing

Смежные вопросы