【问题标题】:can't add relational data with angular and mongodb无法使用 Angular 和 mongodb 添加关系数据
【发布时间】:2014-03-09 01:04:29
【问题描述】:

我有一个视图,其中列出了“运输商”。运输商有任何“交付”,所以我想将交付添加到各自的运输商。

我正在使用 express、mongoose 和 angular.js。我有两个模型定义:

// app/models/transporter.js
var Delivery = require('./delivery');

var transporterSchema = new mongoose.Schema({
    name: String,
    natl_id_num: String,
    phone: String,
    deliveries: [Delivery]
});

var Transporter = mongoose.model('Transporter', transporterSchema);


// app/models/delivery.js
var Transporter = require('./transporter.js');

var deliverySchema = new mongoose.Schema({
    date: { type: Date, default: Date.now },
    transporter: [Transporter],
    amount: Number
})

var Delivery = mongoose.model('Delivery', deliverySchema);

然后我有一个视图,其中包含每个传输器的输入字段和按钮:

<tr ng-repeat="t in transporters track by $index">
    <td>{{t.name}}</td>
    <td>{{t.deliveries.length}}</td>
    <td>
        <input type="text" placeholder="amount" ng-model="deliveryAmount">
    </td>
    <td>
        <button type="submit" ng-click="addDelivery(deliveryAmount, t)">Add</button>
    </td>
</tr>

当我点击按钮时,我想为该运输车添加新的交付。这是对应的控制器:

$scope.addDelivery = function(deliveryAmount, transporter){
            var data = {};
            data.date = Date.now();
            data.amount = deliveryAmount;
            data.transporter = transporter;
            console.log('data equals: ' + data.transporter);

            $http({
                url: '/api/deliveries', 
                data: data,
                method: 'POST',
                headers: {'Content-Type': 'application/x-www-form-urlencoded'}
            })
                .success(function(data, status, headers, config){
                    $('input').val('');
                    console.log(data + ' added');
                })
                .error(function(data){
                    console.log('couldn\'t post delivery: ' + err);
                });
        };

但是,当我列出所有交货时,transporter 和 amount 属性不存在。在控制器中有:

$http.get('/api/deliveries')
        .success(function(data){
            // add all deliveries to deliveries scope
            $scope.deliveries = data;
        })

在视图中有:

<p ng-repeat='d in deliveries'>{{ d }}</p>

但是输出:

{"_id":"52f9f0e5156c0f6303d846ef","__v":0,"transporter":[],"date":"2014-02-11T09:44:05.619Z"}

而不是显示使用addDelivery 函数指定的数量和运输商

此处显示了我用于交付的 REST API:

// all deliveries
app.get('/api/deliveries', function(req, res){
    Delivery.find(function(err, deliveries){
        if(err) res.send(err);

        res.json(deliveries);
    });
});

// create delivery
app.post('/api/deliveries', function(req, res){
    Delivery.create({
        date: req.body.date,
        transporter: req.body.transporter,
        amount: req.body.amount
    }, function(err, delivery){
        if(err) res.send(err);

        Delivery.find(function(err, deliveries){
            if(err) res.send(err);

            res.json(deliveries);
        });
    });
});

【问题讨论】:

  • 所以你知道你的问题是你没有得到你期望的 JSON。但是您没有展示的是如何从您的“/api/deliveries”端点获取和转换它。从那时起,您应该看到您的所有角度代码都与这部分问题无关,并且您已经排除了重要部分。您最好编辑此内容并在此处阅读:stackoverflow.com/help/how-to-ask
  • 好吧,我的错。添加了 express api 路由
  • 拉出棱角分明的东西。真的。这是您要求人们通读与您遇到的问题无关的整个文档负载。您还可以通过包含您希望在响应中看到的 JSON 样本来增加价值,更重要的是数据在 mongo 中的样子。所以不仅仅是模式,数据也是如此。如果角度部分成为问题,那么这是另一个问题。但是您确实阅读了链接上的页面,不是吗:)
  • 对不起,如果这听起来很刺耳。但是聚焦主题并相应地改变你的标题,你会得到更好的回应。附加帖子中已经有一件事很明显。让更多人看到。

标签: javascript node.js mongodb angularjs mongoose


【解决方案1】:

基本上,您对 Mongoose 和您对 JSON 的转换都抱有太多期望,这就是为什么事情没有按您期望的那样工作。让我们关注覆盖“/api/deliveries”端点的代码。

在这里,您调用 find(没有查询),从 Mongo 的角度来看,它会将 光标 返回到 all 文档的结果在这个集合中。现在这可能没问题,但您应该考虑过滤它。

现在您知道您已经使用包含transporterSchema 条目数组的deliverySchema 定义组成了您的架构。最重要的是,您已将这些分配给 两个 模型。这实际上意味着deliveries 的一个集合和transporter 文档的一个集合。

为了获取数据,从 MongoDB 的角度来看,对于每个 Delivery 文档,我们必须向服务器发送另一个请求(或多个请求)以获取 Transporter 文档。现在 Mongoose 的一部分是您可以在编码中透明地执行此操作并访问该子文档数组,就像它是对象上的普通数组一样。但事实上并非如此,而且发生的魔法隐藏了真正的操作。

因此你的问题。您还没有真正将您打算序列化为 JSON 的所有数据提取出来。你所拥有的是一个 cursor,虽然有一个 partial 实现来进行序列化,但它并没有真正知道确切的 smarts它必须做什么才能获取其余数据。

简而言之。您不能只将光标传递给您的 JSON 序列化调用,您需要遍历并将数据保存为您可以序列化的 var

答案的附加部分可能是您实际上想要Embedded Documents,这应该值得一读。毕竟,如果您只想像使用关系一样使用存储,那么使用 MongoDB 毫无意义。

这是故意的“无代码”响应,因为我认为理解为什么事情没有像您预期的那样发展的概念很重要。您还应该有一个良好的基础,知道从哪里开始改变事情,这样它们才能发挥作用。

【讨论】:

  • 是的,很棒,都是关于概念的
  • 希望你也喜欢这个编辑。当它更清晰时,也许有人可能会添加其他内容。
猜你喜欢
  • 2017-10-27
  • 2018-01-28
  • 2017-10-07
  • 2019-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多