通过ObjectId找到mongoose

时间:2016-11-23 04:31:25

标签: node.js mongodb mongoose mongodb-query

我定义了像这样的猫鼬模式

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”。然后我保存了'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' s后,我在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' s)

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

为了获得匹配的帖子,我应该运行什么查询?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

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

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

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

posterName = retrievedPost.poster.id.name;

或者,只需将poster字段直接设为ObjectId,即可直接访问已填充的用户:

posterName = retrievedPost.poster.name;