【问题标题】:MongoDB element on nested schemas and return only that element嵌套模式上的 MongoDB 元素并仅返回该元素
【发布时间】:2020-07-08 13:25:55
【问题描述】:

我有一个简单的 twitter 应用程序的架构

const userSchema = new Schema ({
    loginInfo: {
        username: String,
        email: String,
        password: String 
    },
    tweets: [{
        content: String,
        likes: Number,
        comments: [{
            owner: String,
            content: String,
            likes: Number
        }]
    }],
    followers: [String],
    following: [String]
})

我想让端点只返回具有相同 _id 的推文,该推文已作为 URL 上的参数给出.. 我在下面制作了该解决方案并且它工作正常,但我相信有比这更好的解决方案..

const handleTweet = (User) => (req,res) => {
    const { id } = req.params;
    let theTweet = [];
    User.findOne({ "tweets._id": id})
    .then(user => {
        user.tweets.forEach(tweet => {
            if(tweet._id.toString() === id)
                return theTweet.push(tweet)
        })
        res.json(theTweet)
    })
    .catch(err => res.json(err))
}

module.exports = handleTweet;

还有一个问题:最好是制作这样的嵌套架构还是为每个架构制作不同的模型(在这种情况下,用户的架构和推文的另一个架构)?

【问题讨论】:

    标签: node.js mongodb model schema


    【解决方案1】:

    您应该将推文制作成不同的集合,因为您是基于它进行查询的,然后您可以在需要时使用autopopulate

    你也可以用Array.prototype.find代替foreach

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      您可以使用 mongoose 的 $pushfindOneAndUpdate 方法。您可以将示例修改为:

      User.findOneAndUpdate(id, { $push: { tweets: req.body.tweet } }, {new: true})
          .then((record) => {
            res.status(200).send(record);
          })
          .catch(() => {
            throw new Error("An error occurred");
          });
      

      注意{new: true} 选项,它使findOneAndUpdate 方法返回带有编辑的记录。

      对于您的第二个问题,建议拆分模态以使您的代码更具可读性、可维护性和易于理解。

      【讨论】:

      • 很抱歉让你失望了,但问题是如何获取现有推文而不是如何为第二个问题添加新的 xD,好吧,我将制作 2 个模型,但如何通过 id 引用它们?
      • 啊,抱歉,请考虑使用find 而不是forEach。此外,当您按 id 搜索时,您不必创建一个数组并将其按原样发送到响应中,并且始终是具有此 id 的一个元素。所以find 而不是forEach 然后发送那个元素(不是数组)。
      • 对于第二个问题,还有很多其他解决方案。第一个通过拆分为 2 个模式并使用 populate (检查此 answer ),第二个通过使您的模式如下:js const userSchema = new Schema ({ username: String, email: String, password: String, tweets: [{ content: String, likes: Number, comments: [{ owner: String, content: String, likes: Number }] }], followers: [String], following: [String] })
      • 第三种解决方案是在推文模式中添加authorId 字段并将创建者ID与推文一起保存。
      猜你喜欢
      • 2016-06-05
      • 1970-01-01
      • 2018-10-06
      • 1970-01-01
      • 2016-07-13
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      相关资源
      最近更新 更多