MongoDB .find()只将ObjectId嵌入到Array中。

时间:2016-06-16 15:26:49

标签: javascript arrays mongodb

我试图只从项目数组中嵌入的一个特定文档中获取ObjectId。 基本上我正在尝试建立一个拥有用户的数据库,每个用户都有自己的项目。 谢谢!

db.users.find().pretty()
{
    "_id" : ObjectId("5762c0cf2b9a78006373a684"),
    "name" : "seq",
    "pass" : "seq",
    "projects" : [
        {
            "pid" : ObjectId("5762c0ba2b9a78006373a682"),
            "name" : "aaa"
        },
        {
            "pid" : ObjectId("5762c0ba2b9a78006373a683"),
            "name" : "bbb"
        }
    ]
}
{
    "_id" : ObjectId("5762c28d2b9a78006373a687"),
    "name" : "leq",
    "pass" : "leq",
    "projects" : [
        {
            "pid" : ObjectId("5762c2892b9a78006373a685"),
            "name" : "ccc"
        },
        {
            "pid" : ObjectId("5762c2892b9a78006373a686"),
            "name" : "ddd"
        }
    ]
}

1 个答案:

答案 0 :(得分:0)

假设我们想要两个pid

  

{“pid”:ObjectId(“5762c0ba2b9a78006373a682”)}和   {“pid”:ObjectId(“5762c2892b9a78006373a686”),}

只有内部文件

因此所需的响应应如下所示:

{
    "_id" : ObjectId("5762c0ba2b9a78006373a682"),
    "name" : "aaa"
},{
    "_id" : ObjectId("5762c2892b9a78006373a686"),
    "name" : "ddd"
}

聚合框架可以操作文档,只匹配需要的文档,并按项目阶段转换内部结构:

var match = {
    $match : {
        "projects.pid" : {
            $in : [ObjectId("5762c0ba2b9a78006373a682"), 
                   ObjectId("5762c2892b9a78006373a686")]
        }
    }
}
var unwind = {
    $unwind : "$projects"
};

// now move array objet as top level object
var project = {
    $project : {
        _id : "$projects.pid",
        name : "$projects.name",
        // list other fields here
    }
}
db.vic.aggregate([match, unwind, match, project])