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() 函数返回的文档计数并将其设置为猫鼬中的其他字段