MEAN:无法更新数据到DB
问题描述:
我试着去更新数据通过快递到MongoDB的,虽然我的API响应状态200,林无法更新到猫鼬,进出口使用猫鼬皮值MEAN:无法更新数据到DB
var mongo = require('mongoskin');
var db = mongo.db(config.connectionString, {
native_parser: true
});
var ObjectId = require('mongodb').ObjectID;
db.bind('users');
db.bind('dashboard')
function update(_id, userParam) {
var deferred = Q.defer();
for (var i = 0; i < Object.keys(userParam).length; i++) {
var set = {
file: userParam[i].file,
result: userParam[i].result,
user_id: userParam[i].user_id
};
db.dashboard.update({
_id: mongo.helper.toObjectID(_id)
}, {
$set: set
},
function(err, doc) {
if (err) deferred.reject(err);
deferred.resolve();
});
};
return deferred.promise;
}
我的API
{
"0": {
"_id": "57396e49a6c36801024021a1",
"file": "app_static/audio/SampleAudio_0.4mb.mp3",
"result": "FM",
"user_id": "57396ded0aef5ee405320dbe"
},
"1": {
"_id": "57396e5ca6c36801024021a2",
"file": "app_static/audio/SampleAudio_0.7mb.mp3",
"user_id": "57396ded0aef5ee405320dbe"
}
}
我必须让整个API被认为是和一直推到MongoDB的
也请不要提出任何替代方案,推动整个JSON到MongoDB中有一个for循环..
任何帮助非常感谢预先
由于
答
db.dashboard.update
是异步(又称为非阻塞)函数,它将callback
作为参数。
要调用db.dashboard.update
多次(通过for
环)但的callback
您拒绝或解决相同promise
内。
这意味着,当调用第一个db.dashboard.update
的回调时,将返回promise
的then
方法。
对于其余的更新操作,您的then
函数将不会被通知。
的解决方案:
循环的最后一次迭代中把你的异步代码IIFE
内,打电话给你的deferred.resolve
。
function update(_id, userParam) {
var deferred = Q.defer();
var length = Object.keys(userParam).length;
for (var i = 0; i < length; i++) {
var set = {
file: userParam[i].file,
result: userParam[i].result,
user_id: userParam[i].user_id
};
(function(set, i) { // <------------------------- enclosing everything in an IIFE
db.dashboard.update({
_id: mongo.helper.toObjectID(_id)
}, {
$set: set
},
function(err, doc) {
if (err) {
deferred.reject(err);
} else if (length - 1 === i) { // <-- checking if this is the last iteration
deferred.resolve();
}
});
})(set, i); // <--------------------------------- sharing set and i with the IIFE scope
};
return deferred.promise;
}
使用async.map
。 (这是更优雅的做法)。
function update(_id, userParam) {
var deferred = Q.defer();
/**
* Array to contain all the
* @type {Array}
*/
var arrayOfSets = [];
/**
* Converting each key-value pair in userParam into an array element
* and pushing it into arrayOfSets
*/
for (var i in userParam) {
arrayOfSets.push({
file: userParam[i].file,
result: userParam[i].result,
user_id: userParam[i].user_id
});
}
/**
* Executing async.map
*
* Parameters:
*
* 1. arrayOfSets - each element will be fed to the function in the 2nd parameter
*
* 2. function(item, callback) - in this function do the update operation
*
* 3. function(err, result) - in this function resolve or reject the promise
*/
async.map(arrayOfSets, function(item, callback) {
db.dashboard.update({
_id: mongo.helper.toObjectID(_id)
}, {
$set: item
},
function(err, doc) {
if (err) {
callback(err, null);
} else {
callback(null, doc);
}
});
}, function(err, result) {
if (err) {
deferred.reject(err);
} else {
deferred.resolve(result);
}
});
return deferred.promise;
}
此外,else
代码应始终封闭在else
!
function(err, doc) {
if (err) {
deferred.reject(err);
} else { // always enclose in else!
deferred.resolve();
}
}
感谢您的回复......我没有尝试这两个逻辑,但没有成功..still那里mongo没有更新更新值...! – Coeus
您能否显示您从'db.dashboard.update'命令获得的输出/结果? –
当我控制台db.dashboard.update获得的结果是这样的[功能] – Coeus