繁体   English   中英

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

[英]Mongoose model.find() returns an empty collection

我有这个模特

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({})

您可以使用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);
}

尝试使用:

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,而不是期望的对象。

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

await添加到save调用中,

await block.save();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM