mongoose find by ObjectId



我正在定义这样的猫态架构

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);

用户(帐户持有人)创建帖子时,我将帖子保存在帖子模式中并获取" postid"。然后我保存"邮政"one_answers" accountId"在上面的帐户postschema中

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 }

现在如何找到一个给定帐户的所有匹配的"帖子"?(不是邮政)

例如,如果我的帐户是583509E12052C7A2A93C4026,我需要找到帖子。

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

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

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

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

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,从poster中删除id字段的优点就变得清晰。如果将poster定义为具有字段id的对象并尝试填充它,则需要访问有关海报的数据:

posterName = retrievedPost.poster.id.name;

另外,只要将poster字段直接制作为ObjectId,您就可以更直接地访问填充的用户:

posterName = retrievedPost.poster.name;

最新更新