我遇到这种情况,我需要对来自mongo集合(A)的一组不同值执行逻辑,然后将结果保存到另一个集合(B)。但是,(A)的内容会随着时间而改变,所以我只想在(A)中那些文件中执行逻辑,而(B)中没有相应的文件。由于不支持联接,我试图在节点级别执行此操作。我正在查询集合(A)中的所有项目,并使用findOne
查找集合(B)中的相应条目。如果我找到它,我想将它从数组中删除,但我被卡住了,因为findOne
使用的异步回调似乎不适用于数组filter
方法。有没有更好的方法来做到这一点:
function loadNewDocumentsFromDB(callback){
db.collection('A', function(err, acollection){
bcollection.find().toArray(function(err, arr){
if(arr){
// toQuery is the global array to be used elsewhere
toQuery = arr.map(function(config){
transformed =
{
args: config._id, // these args are a doc representing a unique entry in 'B'
listings: config.value.id.split(',') // used by other functions
};
return transformed;
})
.filter(function(transformed){
db.collection('B', function(err, bcollection){
bcollection.findOne(transformed.args, function(err, doc){
// I want these values returned from the filter function not the callback
if(doc){
return false; // want to remove this from list of toQuery
}else{
return true; // want to keep in my list
});
});
}
callback();
});
});
}
答案 0 :(得分:1)
这就是我设法让它发挥作用的方式:
function loadOptionsFromDB(callback){
toQuery = [];
db.collection('list', function(err, list){
db.collection('data', function(err, data){
list.find().each(function(err, doc){
if(doc){
transformed =
{
args: doc._id,
listings: doc.value.id.split(',')
};
(function(obj){
data.findOne(obj.args, function(err, found){
if(found){}
else{
toQuery.push(obj);
}
});
})(transformed);
}else{
//Done finding
setTimeout(callback, 20000);
}
});
});
});
}
答案 1 :(得分:0)
更好的方法是在数据库上执行此操作。检查http://docs.mongodb.org/manual/core/map-reduce/的2次执行是否对您有用。 有关详细信息,请参阅Merging two collections in MongoDB