【问题标题】:creating an object from mongoose queries从 mongoose 查询创建对象
【发布时间】:2019-08-07 00:51:31
【问题描述】:

如何根据查询结果创建对象?在餐食中,该表具有对数据库的查询功能。如果查询是异步的,我该怎么做?

const returnResultOfQuery = () => {
  Dinner1300.count().exec(function (err, count) {

    const random = Math.floor(Math.random() * count)
  
    Dinner1300.findOne().skip(random).exec(
      function (err, result) {
        console.log(result)
      })
  })

const week = [
  {id: 1, day: 1},
  {id: 2, day: 2},
  {id: 3, day: 3},
  {id: 4, day: 4},
  {id: 5, day: 5},
  {id: 6, day: 6},
  {id: 7, day: 7},
]

const diet = week
  .map(value => ({
    id: value.id,
    day: value.day,
    meals: [
      returnResultOfQuery(),
      returnResultOfQuery(),
      returnResultOfQuery()
    ]
  }))

  console.log(diet)

【问题讨论】:

  • 看起来你的例子不起作用。另外,您能否更新您的问题以包含 Mongo 查询的代码?目前无法回答您的问题,因为我们不知道您的查询是什么样的
  • 我添加了查询示例

标签: javascript node.js mongodb express mongoose


【解决方案1】:

你可以使用代码,它只是一个承诺包装器

const returnResultOfQuery = () => {
return new Promise((resolve, reject) => {
    Dinner1300.count().exec(function (err, count) {
        const random = Math.floor(Math.random() * count)
        Dinner1300.findOne().skip(random).exec(
          function (err, result) {
            if (err) {
                return reject(err);
            }
            return resolve(result);
        });
     });
  });
}

const week = [
  {id: 1, day: 1},
  {id: 2, day: 2},
  {id: 3, day: 3},
  {id: 4, day: 4},
  {id: 5, day: 5},
  {id: 6, day: 6},
  {id: 7, day: 7},
]

 const diet = Promise.all(week
    .map(value => ({
      id: value.id,
      day: value.day,
      meals: [
        returnResultOfQuery(),
        returnResultOfQuery(),
        returnResultOfQuery()
      ]
   }))
 );

console.log(diet)

【讨论】:

    【解决方案2】:

    实现此目的的方法之一是首先使用Promise.all 执行所有查询,一旦获得结果,就创建新对象。比如:

    const week = [
        { id : 1, day : 1 },
        { id : 2, day : 2 },
        { id : 3, day : 3 },
        { id : 4, day : 4 },
        { id : 5, day : 5 },
        { id : 6, day : 6 },
        { id : 7, day : 7 }
    ];
    
    const returnResultOfQuery = () => {
        return Dinner1300.count ().exec ( function ( err, count ) { 
            const random = Math.floor ( Math.random () * count );
    
            return Dinner1300.findOne ().skip ( random ).exec (
                function ( err, result ) {
                    console.log ( result );
                    return result;
                } );
        } );
    };
    
    let promises = [];
    
    for ( let x in week ) {
        promises.push ( returnResultOfQuery () );
        promises.push ( returnResultOfQuery () );
        promises.push ( returnResultOfQuery () );
    }
    
    let diet = [];
    
    Promise.all ( promises ).then ( function ( result ) {
        let i = 0;
        for ( let x in week ) {
            diet.push (
                {
                    id : x.id,
                    day : x.day,
                    meals : [
                        result[ i ],
                        result[ i + 1 ],
                        result[ i + 2 ]
                    ]
                }
            );
            i = i + 3;
        }
    } );
    
    console.log ( diet );
    

    P.S:上面的代码我没有测试过。

    【讨论】:

      猜你喜欢
      • 2020-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多