Javascript Mongo DB返回数组中未定义的值

Javascript Mongo DB返回数组中未定义的值,javascript,mongodb,undefined,Javascript,Mongodb,Undefined,我有一段代码,它获取MongoDB中一周中给定日期的文档数的值。作为返回请求,“qweek”数组被填充 功能日期(当前){ var week=新数组(); //从星期一开始不是星期天 current.setDate((current.getDate()-current.getDay()+1)); 对于(变量i=0;ivar daycount=docs.length);然后是qweek.push(daycount);非常感谢你的帮助。你救了我一天:D@ambianBeing哈哈哈。我正试图实现这两

我有一段代码,它获取MongoDB中一周中给定日期的文档数的值。作为返回请求,“qweek”数组被填充

功能日期(当前){
var week=新数组();
//从星期一开始不是星期天
current.setDate((current.getDate()-current.getDay()+1));
对于(变量i=0;i<7;i++){
var dd=String(current.getDate()).padStart(2,'0');
var mm=String(current.getMonth()+1).padStart(2,'0');//一月是0!
var yyyy=current.getFullYear();
变量日=dd+'/'+mm+'/'+yyyy;
周。推(天);
current.setDate(current.getDate()+1);
}
返回周;
}
//初始化应用程序客户端
const client=stitch.stitch.initializedFaultAppClient(“应用程序id”);
//获取MongoDB服务客户端
const mongodb=client.getServiceClient(
stitch.RemoteMongoClient.factory,
“mongodb地图册”
);
//投影配置
const options={//匹配RemoteFindOptions的形状。
限制:1000,//只返回前十个结果。
投影:{//仅返回'title','releaseDate',和
日期:1,//(隐式)输入“\u id”字段。
},
排序:{//sort by releaseDate descending(最新的第一个)。
发布日期:-1,
},
}
//获取对travels数据库的引用
const db=mongodb.db(“旅行”);
函数displayCountTravels(){
var daysweek=日期(新日期());
var qweek=新数组();
对于(变量l=0;l{
qweek.push(文档长度);
});
}
console.log(qweek);
console.log(qweek[1]);
每周返回;
}
在本例中,当我在阵列控制台中发出请求时。我得到这份报税表:

console.log(qweek);
返回命令
console.log(周)

但是当我试图通过索引获取值时。返回的数组项具有未定义的属性

console.log(qweek[1]);
日志输出:

undefined
返回命令
console.log(第[1]周)


我想知道为什么
undefined

会有这个值,本质上这是Javascript中的
异步
行为。除此之外,
异步
调用是在一个
for..循环中进行的

简短解释:mongo db查询调用本质上是
异步的
,执行不会等到它完成后才到达
控制台.log(qweek)
,该控制台位于
then
块之外。因此,您将得到
qweek
为空[]或
qweek[1]
为未定义

console.log(qweek[1]);
解决这个问题的两种方法是
使用promission和async/await进行序列化,或者使用
Promise.all()
。我建议你仔细阅读,以了解更多

使用
async/await
:语法方面更简洁,更易于理解

async function displayCountTravels() {
  var daysweek = dates(new Date());
  var qweek = [];
  try {
    for (var l = 0; l < daysweek.length; l++) {
      /*wait for the promise to resolve before next iteration*/
      var docs = await db
        .collection("details")
        .find({ day: daysweek[l] }, options).toArray();

      qweek.push(docs.length);
    }
  } catch (e) {
    console.error(e);
  }

  console.log(qweek);
  console.log(qweek[1]);

  return qweek;
}

我认为,如果您能够以纯文本而不是图像的形式提供控制台日志的输出,这将非常有用。谢谢另外,请使用完整的代码更新问题,以便更好地理解场景,特别是在
console
打印值的地方。最有可能发生的情况是:
qweek
console.log
位于
then()块和
console.log(qweek[1])内在外面。@finferty获得建议^^@ambianBeing谢谢你的建议。我照你说的做了。是的,我试着把qweek排除在外。但是这些值没有返回或返回等于零。我尝试在适当的位置放置一个变量,并将数组输入到外部。Ex:then(docs=>var daycount=docs.length);然后是qweek.push(daycount);非常感谢你的帮助。你救了我一天:D@ambianBeing哈哈哈。我正试图实现这两种选择。但在这两方面,我都得到了以下错误<代码>dashboard.html:110未捕获类型错误:db.collection(…)。查找(…)。exec不是一个函数
。如何解决与Exec()相关的问题?这是干什么用的?抱歉问了这么多问题哈哈:D.@JoãoGabrielAraujo抱歉我的不好。写作习惯..因为我在mongodb中使用了mongoose,并且使用了
exec()
来获得全面的承诺。尽管你用的是同样的。显然不是这样,在带有节点的本机mongo中,查询是承诺(不需要
.exec()
)。您可以删除
.exec()
。我已经更新了答案。非常欢迎你。让我知道这是否有效。天哪,天哪。第一个解决方案有效!!!!非常感谢你。天啊。那是个男人,那是个男人!!哈哈。我只是将
exec()
切换到
.toArray()
function displayCountTravels() {
  var daysweek = dates(new Date());
  var promises = [];

  /*each mongo query is a promise, collect and return*/

  for (var l = 0; l < daysweek.length; l++) {
    promises.push(
      db.collection("details").find({ day: daysweek[l] }, options).toArray()
    );
  }

  return Promise.all(promises);
}

/*Calling fn, getting results in then since Promise.all() itself is promise*/
displayCountTravels()
  .then((results) => {
    /*using map to get lengths of the documents returned and put it in qweek*/
    var qweek = results.map((e) => e.length);
    console.log(qweek);
    console.log(qweek[1]);
  })
  .catch((e) => {
    console.error(e);
  });