[英]MongoDB query with array of IDs
我有這個收藏:
{
"_id": "5f1bd6c7d90cb03e845adbbf",
"name": "John Doe",
"likes": [
{
"_id": "5f378b105d337347e8958a50",
"user": "5f357ac9c0d2019cc82b5a2f",
"post": "5f3032894cd4a000175d333c",
},
{
"_id": "5f354e351a98dd7c7081d72d",
"user": "5f357ac9c0d2019cc82b5a2f",
"post": "5f3bf7a44ed4f031bc575c2b"
},
{
"_id": "5f354cc2879f8a81b0ab28fe",
"user": "5f30380288a63e001755401e",
"post": "5f310ce5e18bad001792fb60"
}
]
現在我想找到所有與 likes.post 的 ID 相匹配的帖子。
這有效,但顯然只給了我一個帖子:
const posts = await Post.find({ _id: [user.likes[0].post] });
res.json(posts);
我嘗試了一個 for 循環,但它只返回一個帖子。 當我控制台記錄這個時,我得到所有匹配的帖子:
for (let i = 0; i < user.likes.length; i++) {
const posts = await Post.find({ _id: [user.likes[i].post] });
res.json(posts);
}
您可以使用$in
運算符來做到這一點。
const posts = await Post.find({ _id: { $in: user.likes.map(l => l.post) } });
res.json(posts);
我嘗試了一個 for 循環,但它只返回一個帖子。 當我控制台記錄這個時,我得到所有匹配的帖子:
循環構造失敗,因為您在第一次迭代后發送響應並且連接已關閉。 解決方法如下:
const posts = [];
for (let i = 0; i < user.likes.length; i++) {
const post = await Post.find({ _id: [user.likes[i].post] });
posts.push(post)
}
res.json(posts)
或者像這樣使用 map:
const postPromises = user.likes.map(({ post }) => {
return Post.find({ _id: [user.likes[i].post] });
})
const posts = Promise.all(postPromises);
res.json(post)
但是,您可以修改為獲取該文檔而運行的任何查詢,而不是運行兩個單獨的查詢。 假設您使用的是 mongoose:
Author
.findOne({ name: 'John Doe' })
.populate({
path: 'likes',
populate: { path: 'post' }
})
;
我在路上,現在不能測試這個,但如果失敗了,試試這個:
Author
.findOne({ name: 'John Doe' })
.populate('likes.post')
;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.