通过ObjectId查找mongoose

4

我正在定义一份像这样的mongoose架构

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查找所有匹配的“Posts”?(不是postId)

例如,如果accountId为583509e12052c7a2a93c4026,则需要查找Post._id = 5835096d63efc04da96eb71d和Post._id = 583509e12052c7a2a93c4026的帖子。

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

2个回答

4
我认为,你应该按照以下方式来获取与特定账户id相关的所有帖子。
db.accountposts.find({'account.id' : accountId})
.populate('post.id')
.exec();

3
首先,我建议将您的模式更改为以下内容。
var accountPostSchema = new mongoose.Schema({
  account: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'Account'
  },
  post: { 
    type: mongoose.Schema.Types.ObjectId,
    ref: 'Post'
  }
});

实际上这样做更有意义,特别是当您尝试填充子文档时。实际上,我会说这个模式是无用的。为什么不像以下例子那样定义您的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)中删除id字段的优点在于尝试填充poster后变得更加清晰。如果您将poster定义为带有id字段的对象并尝试填充它,则需要按以下方式访问有关poster的数据:
posterName = retrievedPost.poster.id.name;

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

posterName = retrievedPost.poster.name;

你的方案更有意义。我应该改成这个。谢谢你的建议。 - Rahal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接