【问题标题】:mongoose find by ObjectId猫鼬按 ObjectId 查找
【发布时间】:2017-04-06 23:12:55
【问题描述】:

我正在定义一个像这样的猫鼬模式

var accountPostSchema = new mongoose.Schema({
  account: {
    id: { type: mongoose.Schema.Types.ObjectId, ref: 'Account' }
  },
  post: { 
   id: { type: mongoose.Schema.Types.ObjectId, ref: 'Post' }
  }
});

app.db.model('AccountPost', accountPostSchema);

当用户(帐户持有人)创建帖子时,我将帖子保存在 Post 架构中并获取“postId”。然后我保存“postId”和“accountId” 在上面的 accountPostSchema 中是这样的

var fieldsToSet = {
  post: {
    id: postId
  },
  account: {
    id: accountId
  }
};

db.models.AccountPost.create(fieldsToSet, function(err, accountPost) {
  if (err) {
    // handle error
  }

  // handle success
});

输入几个 postId 和 accountId 后,我在 mongo shell 中看到以下结果

> db.accountposts.find({})
{ "_id" : ObjectId("5835096d63efc04da96eb71e"), "post" : { "id" : ObjectId("5835096d63efc04da96eb71d") }, "account" : { "id" : ObjectId("5833c920c868d7264111da69") }, "__v" : 0 }
{ "_id" : ObjectId("583509e12052c7a2a93c4027"), "post" : { "id" : ObjectId("583509e12052c7a2a93c4026") }, "account" : { "id" : ObjectId("5833c920c868d7264111da69") }, "__v" : 0 }

现在如何在给定 accountId 的情况下找到所有匹配的“帖子”? (不是 postId 的)

例如,如果我的 accountId 是 583509e12052c7a2a93c4026,我需要找到 Post._id=5835096d63efc04da96eb71d 和 Post._id=583509e12052c7a2a93c4026 的帖子

我应该运行什么查询来获取匹配的帖子?

【问题讨论】:

    标签: node.js mongodb mongoose mongodb-query


    【解决方案1】:

    我认为,您应该按照这种方式获取与特定帐户关联的所有帖子。

    db.accountposts.find({'account.id' : accountId})
    .populate('post.id')
    .exec();
    

    【讨论】:

      【解决方案2】:

      首先,我建议将您的架构更改为以下内容

      var accountPostSchema = new mongoose.Schema({
        account: {
          type: mongoose.Schema.Types.ObjectId,
          ref: 'Account'
        },
        post: { 
          type: mongoose.Schema.Types.ObjectId,
          ref: 'Post'
        }
      });
      

      这实际上更有意义,尤其是当您尝试填充子文档时。实际上,我会说这个 Schema 没用。你为什么不像下面这样定义你的Post 架构?

      var PostSchema = new mongoose.Schema({
        poster: {
          type: mongoose.Schema.Types.ObjectId,
          ref: 'Account'
        },
        message: String
      });
      

      如果您使用后一种代码,您可以执行以下查询来获取特定用户的所有帖子:

      db.posts.find({poster: accountId}, function(dbErr, userPosts) {
        if(dbErr) {
          // Handle the error.
        }
      
        // Do something with the posts by accountId in the array userPosts.
      });
      

      一旦您尝试填充poster,从poster 中删除id 字段的优势就会变得很明显。如果您将poster 定义为具有id 字段的对象并尝试填充它,您将需要访问有关海报的数据:

      posterName = retrievedPost.poster.id.name;
      

      或者,只需将poster 字段直接设为ObjectId,您就可以更直接地访问填充的用户:

      posterName = retrievedPost.poster.name;
      

      【讨论】:

      • 您的架构更有意义。我应该改成这个。感谢您的建议。
      猜你喜欢
      • 2016-10-13
      • 2020-07-25
      • 2016-11-21
      • 2016-01-01
      • 2016-11-06
      • 1970-01-01
      • 2017-04-25
      • 2021-11-26
      • 2017-10-24
      相关资源
      最近更新 更多