我定义了像这样的猫鼬模式
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
为了获得匹配的帖子,我应该运行什么查询?
答案 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;