猫鼬.find函数返回空

时间:2019-08-22 15:29:34

标签: node.js mongoose

在对上一个问题进行了一些帮助之后,我决定重新启动所有内容并查看代码的每个部分。当我在robot3T中运行此查询时,它不会返回任何问题。

Robot3T query

db.getCollection('episode').find({show_id: ObjectId("5d54fca24456f4ee892395b1")})

当我运行以下代码时

const episode = new mongoose.Schema({
    show_id: {type:mongoose.Schema.Types.ObjectId},
    show_b: {type:String},
    episode_no: {type:Number},
    title:{type:String},
    summary:{type:String},
    description: {type:String},
    link: {type:String},
    enclosureurl: {type:String},
    pubDate: {type:Date},
    author: {type:String},
    duration: {type:String},
    explicit: {type:String}
});

const EpisodeModel=mongoose.model('episode',episode);



router.get('/ep', (req, res) => {

    /* Pages.find({}, function(err, docs) {
       if (!err){ 
           console.log(docs);
           process.exit();
       } else {throw err;}
     });
   */
  EpisodeModel.find({}).exec(function(err, docs) {
    if (!err){ 
        res.status(200).json({
        docs
        })
        //process.exit();
    } else {console.log(err);}
    });

   });

而不是返回所有行,而是返回

{"docs":[]}

所以有些事情是完全错误的。

我在下面留下了一个RAW JSON字符串,您可以使用该字符串创建自己的JSON mongodb并将其插入收藏集。

{
    "show_id" : ObjectId("5d54fca24456f4ee892395b1"),
    "show_b" : "rantshow",
    "episode_no" : 1,
    "title" : "episode 1",
    "summary" : "this is a test",
    "description" : "test",
    "link" : "test",
    "enclosureurl" : "test",
    "pubDate" : ISODate("2019-08-05T09:40:00.201Z"),
    "author" : "Radio Media PTY LTD",
    "duration" : "01:00:00",
    "explicit" : "yes"
} 

1 个答案:

答案 0 :(得分:0)

从表面上看,您的查询看起来应该可以工作。当您尝试在猫鼬之外运行它时,它起作用吗? (例如,在Studio3T中或通过CLI)

猫鼬可能会感到困惑,因为您的show_id看起来像一个ObjectId,但是在您的架构中被指定为字符串。之所以有时会发生这种情况,是因为Mongoose默认情况下会在需要时将字符串转换为ObjectIds(这样您就不必手动执行此操作)。

我认为这是作为显示文档的关系引用存储的。如果是这种情况,那么您应该按照以下步骤更改架构:

const episode = new mongoose.Schema({
    show_id:{type: mongoose.Types.ObjectId, ref: 'show'},
    ...
});

ref属性应该是您注册了显示模式模型的任何属性。例如,您上面的情节模式使用了“ episode”一词。

您可能需要更新数据库中的情节文档,以确保它存储了ObjectId而不是字符串。

编辑

您的新实现几乎是正确的。如果您将一个配置添加到情节模式中,那么它应该可以工作。

const episode = new mongoose.Schema({
        show_id: {type:mongoose.Schema.Types.ObjectId},
        show_b: {type:String},
        episode_no: {type:Number},
        title:{type:String},
        summary:{type:String},
        description: {type:String},
        link: {type:String},
        enclosureurl: {type:String},
        pubDate: {type:Date},
        author: {type:String},
        duration: {type:String},
        explicit: {type:String}
      }, { collection: 'episode'});

请注意,在此架构对象的底部,我已指示它应使用情节集合。将其更改为您用于剧集的任何收藏集。我在一个本地项目中对此进行了测试,它对我的​​其余代码都适用。