Mongoose /表达如何只检索数组的值

时间:2016-07-20 11:47:31

标签: node.js mongodb express

我是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); } );

在查询中过滤它是否合适,或者是在返回的脚本中过滤的正确方法。

请建议。谢谢你的时间。

1 个答案:

答案 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:始终为函数的回调和异步函数回调使用不同的名称。