我是node.js的新手,想做以下事情。
编写一个查询以从mongoDb获取注释(数组值)键,并将此数组值[only]作为参数传递给第二个查询。
这是我的代码
// create the carousel based on the associated stills using keyword annotations
function findAssociatedArchivalStills(carousels, taskCb){
async.waterfall([
// 1st query
function findAssociatedAnnotations(archiveId, taskCb) {
Archive.findAnnotations(archiveId, function onResult(err,annotations){
console.log(annotations);
taskCb(err,annotations);
});
},
// 2nd query
function findAssociatedStills(annotations,taskCb) {
Still.findAssociatedStills(annotations,function onResult(err,stills){
taskCb(err,stills);
});
},
function buildCarousel(stills,taskCb) {
return taskCb(null, new Carousel({
title: 'Related Stills',
items: stills,
}));
},
], function onFinish(err) {
taskCb(null, carousels);
});
},
// done building the associated Episodes carousel
], function onFinish(err, carousels) {
handleResponse(err, res, carousels);
});
});
方法定义如下
1st query definition in model
schema.statics.findAnnotations = function findAnnotations(archiveId, cb) {
this.findOne()
.where('_id', types.ObjectId(archiveId))
.select({'keywords':1, '_id':0})
.exec(cb);
};
2nd query definition in model
schema.statics.findAssociatedStills = function
findAssociatedStills(Annotations, cb) {
this.find()
.where({$text: { $search:Annotations}},{score:{$meta:"textScore"}})
.sort({score:{$meta:"textScore"}})
.limit(2)
.exec(cb);
};
问题是
当我运行第一个查询时,它将返回以下内容 {关键字: ['爱尔兰', '选举&#39 ;, ' PARTY_POLITICAL_BROADCASTS&#39 ;, ' FINE_GAEL' ]}
但是下一个查询的输入应该只是诸如的值 '爱尔兰','选举',' PARTY_POLITICAL_BROADCASTS',' FINE_GAEL'
如何从结果中仅过滤没有键
的数组的值我知道MongoDb中的查询是什么
如下
db.archives.episodes.find({_id:ObjectId("577cd9558786332020aff74c")}, {keywords:1, _id:0}).forEach( function(x) { print(x.keywords); } );
在查询中过滤它是否合适,或者是在返回的脚本中过滤的正确方法。
请建议。谢谢你的时间。
答案 0 :(得分:0)
你使用的是系列,而不是瀑布。并且您的 archiveId 无法在第一个函数中设置。您需要在async.waterfall之前设置它。
这是正确的语法(带瀑布):
function findAssociatedArchivalStills(carousels, masterCallback){
var archiveId = 'yourArchiveId';
async.waterfall([
// 1st query
function findAssociatedAnnotations(taskCallback) {
Archive.findAnnotations(archiveId, taskCallback);
},
// 2nd query
function findAssociatedStills(annotations, taskCallback) {
Still.findAssociatedStills(annotations,taskCallback);
},
function buildCarousel(stills, taskCallback) {
return taskCallback(null, new Carousel({
title: 'Related Stills',
items: stills
}));
}
], function onFinish(err) {
if (err){
return masterCallback(err);
}
masterCallback(null, carousels);
});
}
文档: http://caolan.github.io/async/docs.html#.waterfall
PS:始终为函数的回调和异步函数回调使用不同的名称。