Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript mongoose/MEAN.js-model.find()在过滤后返回空数组_Javascript_Node.js_Mongodb_Mongoose_Mean Stack - Fatal编程技术网

Javascript mongoose/MEAN.js-model.find()在过滤后返回空数组

Javascript mongoose/MEAN.js-model.find()在过滤后返回空数组,javascript,node.js,mongodb,mongoose,mean-stack,Javascript,Node.js,Mongodb,Mongoose,Mean Stack,我不熟悉mean.js,所以它可能是错误的语法,但是当我使用model.find()和内部查询(option.find({poll\u id:1})时,它返回一个空数组 poll.server.model.js 'use strict'; /** * Module dependencies. */ var mongoose = require('mongoose'), Schema = mongoose.Schema; /** * Poll Schema */ var Pol

我不熟悉mean.js,所以它可能是错误的语法,但是当我使用model.find()和内部查询(option.find({poll\u id:1})时,它返回一个空数组

poll.server.model.js

'use strict';

/**
 * Module dependencies.
 */
var mongoose = require('mongoose'),
    Schema = mongoose.Schema;

/**
 * Poll Schema
 */
var PollSchema = new Schema({
    poll_id: {type:Number},
    user_id: {type:Number},
    poll_question: {type:String},
    poll_language: {type:String},
    poll_description: {type:String},
    poll_description_raw: {type:String},
    poll_weight_additional: {type:Number},
    poll_flag_active:{type:Number,default:1},
    poll_flag_18plus:{type:Number,default:0},
    poll_flag_expire:{type:Number,default:0},
    poll_flag_deleted:{type:Number,default:0},
    poll_flag_moderated:{type:Number,default:0},
    poll_flag_favourised:{type:Number,default:0},
    poll_date_expiration:{type:Date},
    poll_date_inserted:{type:Date,default:Date.now()},
    poll_flag_updated:{type:Date},
    show_thumbs:{type:Number},
    comments:{
        type: Schema.ObjectId,
        ref: 'User'
    }
});

mongoose.model('Poll', PollSchema);
'use strict';

/**
 * Module dependencies.
 */
var mongoose = require('mongoose'),
    Schema = mongoose.Schema;

/**
 * Option Schema
 */
var OptionSchema = new Schema({
    option_id:{type:Number},
    poll_id:{type:Number},
    option:{type:Number}
});

mongoose.model('Option', OptionSchema);
option.server.model.js

'use strict';

/**
 * Module dependencies.
 */
var mongoose = require('mongoose'),
    Schema = mongoose.Schema;

/**
 * Poll Schema
 */
var PollSchema = new Schema({
    poll_id: {type:Number},
    user_id: {type:Number},
    poll_question: {type:String},
    poll_language: {type:String},
    poll_description: {type:String},
    poll_description_raw: {type:String},
    poll_weight_additional: {type:Number},
    poll_flag_active:{type:Number,default:1},
    poll_flag_18plus:{type:Number,default:0},
    poll_flag_expire:{type:Number,default:0},
    poll_flag_deleted:{type:Number,default:0},
    poll_flag_moderated:{type:Number,default:0},
    poll_flag_favourised:{type:Number,default:0},
    poll_date_expiration:{type:Date},
    poll_date_inserted:{type:Date,default:Date.now()},
    poll_flag_updated:{type:Date},
    show_thumbs:{type:Number},
    comments:{
        type: Schema.ObjectId,
        ref: 'User'
    }
});

mongoose.model('Poll', PollSchema);
'use strict';

/**
 * Module dependencies.
 */
var mongoose = require('mongoose'),
    Schema = mongoose.Schema;

/**
 * Option Schema
 */
var OptionSchema = new Schema({
    option_id:{type:Number},
    poll_id:{type:Number},
    option:{type:Number}
});

mongoose.model('Option', OptionSchema);
polls.server.controller.js

/**
 * Module dependencies.
 */
var mongoose = require('mongoose'),
    errorHandler = require('./errors.server.controller'),
    Poll = mongoose.model('Poll'),
    Option = mongoose.model('Option'),
    _ = require('lodash');

/**
 * List of Polls
 */
exports.list = function(req, res) {
    Poll.find().limit(10).sort('_id')/*.populate('user', 'displayName')*/.exec(function(err, polls) {
        if (err) {

            return res.status(400).send({
                message: errorHandler.getErrorMessage(err)
            });

        } else {
            for (var i=0; i < polls.length; i++) {
                // this works, returns an array with 10 items
                Option.find().exec(function(err,docs){
                    console.log(docs); 
                });
                // this doesnt! although i see in the former array that there are options
                // with the poll_id set to 1.
                Option.find({'poll_id':1}).exec(function(err,docs){
                    console.log(docs); 
                });

            }
            res.json(polls);
        }
    });
};
/**
*模块依赖关系。
*/
var mongoose=require('mongoose'),
errorHandler=require('./errors.server.controller'),
Poll=mongoose.model('Poll'),
Option=mongoose.model('Option'),
_=需要('lodash');
/**
*投票名单
*/
exports.list=功能(请求、恢复){
Poll.find().limit(10).sort('u id')/*.populate('user','displayName')*/.exec(函数(err,polls){
如果(错误){
返回资源状态(400)。发送({
消息:errorHandler.getErrorMessage(err)
});
}否则{
对于(变量i=0;i
我做错了什么?我查过了,但是我没有看到任何关于我问题的帖子。
我尝试使用model.find()。其中('poll_id')。等于(1),带引号和不带引号,但没有。当我运行model.find()时它可以工作,但无论我如何过滤它,它都会返回一个空数组。感谢adcvance!

我知道您是从MySQL导入的,但是使用Mongoose存储和搜索数据的正确方法是使用population和refs:

var Polls = mongoose.Schema({
  options: [{ type: Schema.Types.ObjectId, ref: 'Options' }]
});

var Options = mongoose.Schema({
  ...
});

Polls
  .find()
  .limit(10)
  .sort('_id')
  .populate('options')
  .exec(function (err, polls) {
    console.log(polls.options); // => [ array of options ]
  });
相关文件可在此处找到

我强烈建议您花一些时间重新构造数据,以便您可以利用填充和引用(索引、更干净的代码等)的许多优点。不要犯试图在文档存储上强制使用关系范式的错误。完全删除band aide或坚持使用您所获得和知道的内容

也就是说,您可以使用当前数据实现所需的功能,如下所示:

// npm install --save async
var async = require('async');

exports.list = function(req, res, next) {

  Poll.find().limit(10).sort('_id').exec(function (err, polls) {

    // In true HTTP parlance, the correct thing to do here would 
    // be to respond with a 500 instead of a 400. The error would
    // be coming from MongoDB, not a poorly formed request by the
    // client. Remember: 40Xs are for client errors and 50Xs are 
    // for server errors. If this is express, you should also look
    // into using a middleware error handler and passing the error 
    // down the line like so:
    if (err) return next(err);

    // Since you used a return statement above, there is no need for 
    // the if/else but this is a matter of style. If it helps with the
    // readability of your code, keep it. I choose to eliminate because
    // async code has enough nesting as it is!

    // https://github.com/caolan/async#maparr-iterator-callback
    async.map(polls, function (poll, callback) {

      // Now look up your option by its poll_id
      Option.find({'poll_id': poll.poll_id}, function (err, options) {
        if (err) return callback(err);
        poll.options = options;
        callback(null, poll);
      });

    }, function (err, data) {

      // Again, this would be a Mongo error, so pass it down the line to
      // handle as a generic 500.
      if (err) return next(err);

      // The data parameter is your newly mapped polls array
      res.json(data);

    });
  });
};    

请注意,在没有填充和引用的情况下,要实现更多的样板文件。此外,在隐藏的情况下,填充只会对数据库的影响是这里的两倍,而在这里,您的影响是11倍。从长远来看,您最好现在就更改数据,然后生成一个关系/文档存储混合体。我见过它们,它们并不漂亮y;)

这是一个典型的比赛条件。控制器中的for循环与
res.json
调用并行执行,这意味着服务器在执行第一个循环之前响应客户端请求。您需要重新构造代码。我建议查看
async
库。在这种情况下,您建议我如何重构代码?在回调中插入res.json?对不起,我对这件事一无所知1)永远不要为问问题而道歉——因为你在学习,所以假设你在问问题。这个论坛上任何警告你提问的人都没有抓住要点。2) 你能用简单的英语写下你想要实现的查询吗?你的控制器中有几个“问题区域”,在我可以帮忙之前,最好先了解一下你的目标。基本上,我有一个页面,上面有民意调查集合的民意调查列表。每个轮询都有存储在另一个集合(选项集合)中的选项。选项集合中的每个文档都有3个字段,其中一个字段是poll_id,这也是与此选项相关的轮询的id。因此,我希望轮询列表中的每个轮询都有一个选项数组,我需要通过poll_id属性来检索它(这个项目是从MySql导入的,所以我现在不能使用obeject.\u id属性)。谢谢!我接受这个答案只是因为你是对的,把绷带完全取下来!但解决方案并不奏效。我从那里走了很长(或者不是很长)的路,但在下一步,我又遇到了一个问题。如果你想再次帮忙->:)@DavidNelband我很高兴你从答案中得到了一些东西。我不是一个吝啬的堆栈开发人员,因为我不能忍受角度。在我看来,业务逻辑和模板之间应该有严格的分离。在这种情况下,像
onclick=“blah()”
这样的内联javascript被认为是不好的做法,那么除了固有的作用域之外,与
ng click=“blah”
有什么区别呢?娜达。