猫鼬model.find()返回一个空集合

时间:2019-04-26 09:32:20

标签: node.js mongodb mongoose

我有这个模特

const BlockModel = Mongoose.model('blocks', {    
    height: Number,
    size: Number,
    time: Number
})

此API调用(hapi.js)

server.route({
    method: "GET",
    path: "/api/blockinfo",
    handler: async (request, h) => {
        await BlockModel.deleteMany({})
        const { res, payload } = await Wreck.get('https://someurl');
        let myJson = JSON.parse(payload.toString()).blocks
        // console.log(myJson)
        for (let i = 0; i < myJson.length; i++) {
            var block = new BlockModel({
                height: myJson[i].height,
                size: myJson[i].size,
                time: myJson[i].time
            });
            block.save();
        }

       console.log(BlockModel.find({}))  
       return  BlockModel.find({});  //returns an empty array

    }
})

因此,它基本上删除了集合的内容,然后将新数据上传到其中。我想返回该集合,以便将其显示在我的API中。但是BlockModel.find({})返回的是一个空集合,尽管如果我使用mongo控制台并检查

,我可以检查该集合是否为空
db.blocks.find({})

3 个答案:

答案 0 :(得分:0)

您可以使用insertMany创建所需的块。此方法将直接向您返回新插入的数据。

async(request, h) => {
  await BlockModel.deleteMany({});

  const {
    res,
    payload
  } = await Wreck.get('https://someurl');

  const myJson = JSON.parse(payload.toString()).blocks

  // Create new items and save them into the database.
  // insertMany returns the added blocks
  return BlockModel.insertMany(myJson.map(x => ({
    height: x.height,
    size: x.size,
    time: x.time
  })));
}


如果myJson看起来像:

[{
  height,
  size,
  time,
}]

您可以将代码转换为:

async(request, h) => {
  await BlockModel.deleteMany({});

  const {
    res,
    payload
  } = await Wreck.get('https://someurl');

  const myJson = JSON.parse(payload.toString()).blocks

  // Create new items and save them into the database.
  // insertMany returns the added blocks
  return BlockModel.insertMany(myJson);
}

答案 1 :(得分:0)

尝试使用:

await block.save();
// wait to save block before return
// ....

const blocks = await BlockModel.find({})
console.log(blocks)  
return blocks;

我认为您的代码运行正常(不是console.log),因为您致电:

console.log(BlockModel.find({}))

它将记录一个Promise,而不是期望的对象。

我们将其存储在一个变量中,因为我们不需要两次调用查询。

答案 2 :(得分:-1)

await添加到save通话中,

await block.save();