从作为一个文档一部分的对象数组中获取一个元素(mongoose)

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 匹配的元素。

  • 这会返回一个数组,但仅返回与您的 $elemMatch 匹配的元素(在我的情况下,由于 id 是唯一的,因此只有一个元素) (2认同)

Ber*_*tel 8

你并不真的需要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)