同时保存两个引用的文档

时间:2014-09-19 00:42:11

标签: node.js angularjs mongodb mongoose meanjs

我有一个股票申请,我想设置股票的一些细节,然后插入股票的所有项目。我想在两个不同的集合中插入股票详细信息和项目,然后我可以过滤项目。我正在使用MEAN Stack,我已经修改了crud模块以接受一些额外的字段,并且还创建了用于填充items数组的UI。这是我到目前为止所拥有的:

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?

1 个答案:

答案 0 :(得分:0)

同时说'我认为你需要事务功能,这实际上是一个RDBMS的东西,MongoDB不支持。如果您的应用程序非常依赖这些功能,我担心MongoDB不适合您。

回到你的问题,我不明白为什么你必须将stockstock 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
]);