Rya*_*yan 6 mongoose mongodb node.js mongodb-query
我有一个包含的架构Friends.Friends是一个数组,其中每个元素都是一个包含id,gender和emoji的对象.
var userSchema = new Schema({
id: {
type: String,
unique: true,
required: true
},
gender: String,
Friends: [{
id: String
gender: String
emoji: String
}]
});
Run Code Online (Sandbox Code Playgroud)
在下面的代码中,我正在访问一个包含Friends数组的文档,并指定使用它的搜索distinct只显示文档的Friends数组.我只需要访问包含指定id的那个数组的一个元素.不像在代码中完成的那样在查询之后过滤那个数组,有没有办法只从查询中获取元素?换句话说,是否有一个额外的功能来区分或某种类型的猫鼬运算符,允许这样做?
User.findOne().distinct('Friends', { id: req.body.myId }).then(function(myDoc) {
var friendAtt = myDoc.filter(function(obj) {
return obj.id == req.body.id
})[0]
})
Run Code Online (Sandbox Code Playgroud)
Rya*_*yan 14
多亏了bertrand,我才能找到答案在于' Projection'。在 mongodb 中是 ' $',在 mongoose 中是select. 这是我如何使它工作:
User.findOne({id: req.body.myId}).select({ Friends: {$elemMatch: {id: req.body.id}}}),
Run Code Online (Sandbox Code Playgroud)
它只返回与朋友中指定的 id 匹配的元素。
你并不真的需要distinct在这里,你可以使用find()上Friends.id和过滤第一子文档匹配Friends.id与位置参数$:
db.user.find(
{ 'id': 'id1', 'Friends.id': 'id2'},
{ 'Friends.$': 1 }
)
Run Code Online (Sandbox Code Playgroud)
在猫鼬中:
User.find({ 'id': req.body.myId, 'Friends.id': req.body.id }, { 'Friends.$': 1 }).then(function(myDoc) {
console.log("_id :" + myDoc[0].Friends[0].id);
console.log("gender:" + myDoc[0].Friends[0].gender);
})
Run Code Online (Sandbox Code Playgroud)