Mongoose如何选择嵌入数组

时间:2015-12-01 15:34:14

标签: node.js mongodb mongoose

我一直在寻找并仍然无法找到正确的答案。

基本上我在mongodb中有以下数据模型

{
"_id": {
    "$oid": "565db83bcd7bef020b1bdae8"
},
"userId": {
    "$oid": "5653a3267827f178214918fc"
},
"targetUser": [
    {
        "userId": {
            "$oid": "564663a5c0aefc151625b5e2"
        },
        "status": "Approved",
        "_id": {
            "$oid": "565db83bcd7bef020b1bdaea"
        }
    },
    {
        "userId": {
            "$oid": "564548249bb75c600ff94cdd"
        },
        "status": "Sent",
        "_id": {
            "$oid": "565db884cd7bef020b1bdaed"
        }
    }
]
},
{
"_id": {
    "$oid": "565db884cd7bef020b1bdaec"
},
"userId": {
    "$oid": "564548249bb75c600ff94cdd"
},
"targetUser": [
    {
        "userId": {
            "$oid": "5653a3267827f178214918fc"
        },
        "status": "Pending",
        "_id": {
            "$oid": "565db884cd7bef020b1bdaee"
        }
    }
]
}

我怎样才能返回以下数据???

{
"userId": {
    "$oid": "5653a3267827f178214918fc"
},
"targetUser": [
    {
        "userId": {
            "$oid": "564663a5c0aefc151625b5e2"
        },
        "status": "Approved",
        "_id": {
            "$oid": "565db83bcd7bef020b1bdaea"
        }
    },
}

我使用了下面的代码,但结果是返回null

Connection.aggregate([
    {$match:{userId:'5653a3267827f178214918fc'}},
    {$unwind:'$targetUser'},
    {$match:{'targetUser.status':'Approved'}},
    {$group:{
        _id:'$_id',
        targetUser:{
            $push:{
                status:'$targetUser.status'
            }
        }
    }}
],function(err,connections){
    console.log(connections);
    console.log(err);
})

非常感谢您的帮助

1 个答案:

答案 0 :(得分:0)

从我看到的,你不需要聚合,一个带有投影参数的简单find将返回你需要的东西。

Connection.findOne({
    userId: new ObjectId("5653a3267827f178214918fc")
}).select({
    targetUser: {
        $elemMatch: { status: "Approved" }
    }
}).exec(callback);

但如果您的字段数超过userIdtargetUser,则需要在第二个参数中添加这些字段

Connection.findOne({
    userId: new ObjectId("5653a3267827f178214918fc")
}).select({
    targetUser: {
        $elemMatch: { status: "Approved" }
    },
    oneMoreField: 1,
    anotherField: 1
}).exec(callback);