2016-11-23 122 views
0

我定义这样猫鼬找到的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); 

猫鼬架构当用户(账户持有人)创建一个帖子,我保存在后的模式后,并获得了“帖子ID”。然后,我保存了“帖子ID”,并在上面accountPostSchema的“帐户ID” 这样

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

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

    // handle success 
}); 

进入几个帖子ID的经过和帐户ID的,我看到了下面的结果在蒙戈外壳

> 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? (不是帖子ID的)

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

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

回答

1

我认为,你应该按照这种方式来获得与特定accountid相关的所有帖子。

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

谢谢!这工作 – Rahal

+0

欢迎您。 :D –

1

首先,我建议改变你的架构下面

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去除id领域的优势变得清晰填充poster。如果你定义poster与现场id对象,并尝试填充它,你将需要访问有关海报数据,例如:

posterName = retrievedPost.poster.id.name; 

或者,只是使poster领域的ObjectId直接,你可以更直接地访问填充的用户:

posterName = retrievedPost.poster.name; 
+0

你的模式更有意义。我应该改变这一点。感谢您的建议。 – Rahal