使用节点和猫鼬从数组中创建新 mongoDB 文档的最佳方法是什么?
What is the best way to make new mongoDB documents off of an array using node and mongoose?
我正在使用 MeanJS,用户输入一个对象列表,每个对象都需要创建一个新文档。同时,我需要创建另一个单独的文档,其中包含指向数组中每个对象的指针,并且 link 每个对象也指向这个新文档。因此,最终结果需要是模型 'Q' 的任意数量的文档 linked 到模型 'S'.
的另一个文档
我尝试这样做的原因是允许用户创建问题调查。每个问题都将是其自己的填充调查的对象(作为一个 属性,将包含这些问题 ID 的列表)。
S = {"_id": 0, "Qids": [ObjectId("1"), ObjectId("2"), ObjectId("3"), ObjectId("4")]}
Q1 = {"_id": ObjectId("1"), "Sid": ObjectId("0")}
Q2 = {"_id": ObjectId("2"), "Sid": ObjectId("0")}
Q3 = {"_id": ObjectId("3"), "Sid": ObjectId("0")}
Q4 = {"_id": ObjectId("4"), "Sid": ObjectId("0")}
我的问题:如果没有 运行 某种回调问题,我似乎无法做到这一点。有人可以给我一些建议吗?这是现在的样子:
客户端:
$scope.Qlist = [Q1, Q2, Q3, Q4];
$scope.S = {};
$http.post('/S', $scope.S).success(function(data){
var req_obj = {
Sid: data._id,
Q: {}
};
for (var i = 0; i<$scope.Qlist.length; i++) {
req_obj.Q = $scope.Qlist[i];
$http.post('/Q', req_obj);
};
});
服务器端:
app.route('/Q')
.post(users.requiresLogin, questions.hasAuthorization, questions.fillSurvey);
然后我有处理这些功能的服务器端控制器。 questions.fillsurvey 函数将问题添加到 MongoDB 中,然后将每个问题的id 推送到Qids 下的S 文档中。大部分工作正常,但是当客户端发送 Q1、Q2、Q3 和 Q4 时,服务器只接收 Q4,四次。
理想情况下,我想在一个 post 请求中同时发送 $scope.Qlist
和 $scope.S
并让服务器端解决所有问题,但我一直被回调函数,这就是为什么我选择在客户端通过 $scope.Qlist
循环 post。如果有人对此有 "best practices" 解决方案,我将不胜感激!
简短回答:您需要在 for
循环中定义 req_obj
。
长答案:JavaScript 依靠称为闭包的东西来处理变量作用域。 JavaScript 也是一种异步语言。这意味着在 JS 中,您的 for 循环将不会等待 $http.post 完成后再继续。
通过将 req_obj 放在 for 循环之外,JS 的异步部分在第一个 $http 完成准备和触发之前修改 req_obj.Q 4 次。将req_obj移入for循环中,将其从上面的闭包中取出,放入for循环的闭包中,类似于匿名函数
我正在使用 MeanJS,用户输入一个对象列表,每个对象都需要创建一个新文档。同时,我需要创建另一个单独的文档,其中包含指向数组中每个对象的指针,并且 link 每个对象也指向这个新文档。因此,最终结果需要是模型 'Q' 的任意数量的文档 linked 到模型 'S'.
的另一个文档我尝试这样做的原因是允许用户创建问题调查。每个问题都将是其自己的填充调查的对象(作为一个 属性,将包含这些问题 ID 的列表)。
S = {"_id": 0, "Qids": [ObjectId("1"), ObjectId("2"), ObjectId("3"), ObjectId("4")]}
Q1 = {"_id": ObjectId("1"), "Sid": ObjectId("0")}
Q2 = {"_id": ObjectId("2"), "Sid": ObjectId("0")}
Q3 = {"_id": ObjectId("3"), "Sid": ObjectId("0")}
Q4 = {"_id": ObjectId("4"), "Sid": ObjectId("0")}
我的问题:如果没有 运行 某种回调问题,我似乎无法做到这一点。有人可以给我一些建议吗?这是现在的样子:
客户端:
$scope.Qlist = [Q1, Q2, Q3, Q4];
$scope.S = {};
$http.post('/S', $scope.S).success(function(data){
var req_obj = {
Sid: data._id,
Q: {}
};
for (var i = 0; i<$scope.Qlist.length; i++) {
req_obj.Q = $scope.Qlist[i];
$http.post('/Q', req_obj);
};
});
服务器端:
app.route('/Q')
.post(users.requiresLogin, questions.hasAuthorization, questions.fillSurvey);
然后我有处理这些功能的服务器端控制器。 questions.fillsurvey 函数将问题添加到 MongoDB 中,然后将每个问题的id 推送到Qids 下的S 文档中。大部分工作正常,但是当客户端发送 Q1、Q2、Q3 和 Q4 时,服务器只接收 Q4,四次。
理想情况下,我想在一个 post 请求中同时发送 $scope.Qlist
和 $scope.S
并让服务器端解决所有问题,但我一直被回调函数,这就是为什么我选择在客户端通过 $scope.Qlist
循环 post。如果有人对此有 "best practices" 解决方案,我将不胜感激!
简短回答:您需要在 for
循环中定义 req_obj
。
长答案:JavaScript 依靠称为闭包的东西来处理变量作用域。 JavaScript 也是一种异步语言。这意味着在 JS 中,您的 for 循环将不会等待 $http.post 完成后再继续。
通过将 req_obj 放在 for 循环之外,JS 的异步部分在第一个 $http 完成准备和触发之前修改 req_obj.Q 4 次。将req_obj移入for循环中,将其从上面的闭包中取出,放入for循环的闭包中,类似于匿名函数