countDocuments Mongoose 的问题:它实际上并没有等待回调函数执行

Posted

技术标签:

【中文标题】countDocuments Mongoose 的问题:它实际上并没有等待回调函数执行【英文标题】:Problem with countDocuments Mongoose: its not actually waiting for the callback function to execute 【发布时间】:2020-09-03 15:40:23 【问题描述】:

我遇到了 Mongoose 后端的问题。我想这是一个异步问题。有人可以解释一下 countDocuments 的工作原理吗?

    albumFields.features = [];
    for await (const feature of features) 
      await Artist.countDocuments( _id: feature._id , (err, count) => 
        if (count > 0) 
          albumFields.features.push( _id: feature._id );
        
        console.log('artist.count', albumFields.features);
      );
      console.log('features.forEach', albumFields.features);
    
    console.log('!!!', albumFields.features);

我得到的输出是:

artist.count [  _id: '5ec09f9c99339f3ad85973c0'  ]
features.forEach [  _id: '5ec09f9c99339f3ad85973c0'  ]
features.forEach  [  _id: '5ec09f9c99339f3ad85973c0'  ]
!!! [  _id: '5ec09f9c99339f3ad85973c0'  ]
artist.count [  _id: '5ec09f9c99339f3ad85973c0' ,
   _id: '5ec09fb199339f3ad85973c4'  ]

我期望的输出是:

artist.count [  _id: '5ec09f9c99339f3ad85973c0'  ]
features.forEach [  _id: '5ec09f9c99339f3ad85973c0'  ]
artist.count [  _id: '5ec09f9c99339f3ad85973c0' ,
   _id: '5ec09fb199339f3ad85973c4'  ]
features.forEach [  _id: '5ec09f9c99339f3ad85973c0' ,
   _id: '5ec09fb199339f3ad85973c4'  ]
!!! [  _id: '5ec09f9c99339f3ad85973c0' ,
   _id: '5ec09fb199339f3ad85973c4'  ]

【问题讨论】:

【参考方案1】:

所以问题是 countDocuments() 只有在没有回调函数的情况下才会返回一个承诺。在我们的例子中,我们创建了获取与过滤器匹配的文档数量的回调。

我不确定为什么代码会以这种方式执行,也许有人可以解释,但我确实设法解决了问题。

    let arraytest = [];
    for (const feature of features) 
      await Artist.countDocuments( _id: feature._id ).then((count) => 
        if (count > 0) 
          albumFields.features = [
            ...albumFields.features,
             _id: feature._id ,
          ];
        
      );
    

对于遇到同样问题的其他人,mongoose 文档中有一个链接,很容易错过。

https://mongodb.github.io/node-mongodb-native/3.1/api/Collection.html#countDocuments

【讨论】:

以上是关于countDocuments Mongoose 的问题:它实际上并没有等待回调函数执行的主要内容,如果未能解决你的问题,请参考以下文章

如何获取 Model.countDocuments() 函数返回的文档计数并将其设置为猫鼬中的其他字段

查找 mongo 文档计数的最佳做法是啥?

Mongodb获取结果数

使用 ISODate 转换查询

在 @nestjs/mongoose 中设置 mongoose 全局选项

mongoose入门以及 mongoose 实现数据 的增删改查