簡體   English   中英

MongoDB 帶有 ID 數組的查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM