在mongodb中的数组中选择一个字段,仅显示唯一字段

时间:2014-09-04 08:38:19

标签: mongodb mongoose mongodb-query aggregation-framework

需要在mongodb中的数组中选择一个字段。

{
"_id" : ObjectId("53dbb05fa976627439d43884"),
"employee" : [ 
    {
        "dateJoin" : "1986-03-10",
        "deptName" : "x",

    }, 
    {
        "dateJoin" : "1986-12-11",
        "deptName" : "y",

    },
 {
        "dateJoin" : "1986-12-11",
        "deptName" : "y",

    }
 ]
 }

在我的情况下,我想选择所有可用的唯一deptName。输出如下所示。

  { deptName:x,
   deptName:y }

到目前为止,我已尝试过以下命令,但没有运气。

db.employee.find( {},{ employee.deptName:1})

2 个答案:

答案 0 :(得分:1)

聚合框架可能是你的方式,但是如果你只是在整个集合中使用不同的值,那就是.distinct()方法:

db.collection.distinct("employee.deptName")

哪个输出:

 ["x","y"]

或者aggregation framework只做:

db.collection.aggregate([
    { "$unwind": "$employee" },
    { "$group": { "_id": "employee.deptName" } }
])

哪个输出:

{ "_id" : "y" }
{ "_id" : "x" }

或者与单个文档结果相同:

db.collection.aggregate([
    { "$unwind": "$employee" },
    { "$group": { 
        "_id": null,
        "deptName": { "$addToSet": "$employee.deptName" }
    }}
])

哪个输出:

{ "_id" : null, "deptName" : [ "y", "x" ] }

或者,如果您真的想要每个文档,那么就像这样:

db.collection.aggregate([
    { "$unwind": "$employee" },
    { "$group": { 
        "_id": "$_id",
        "deptName": { "$addToSet": "$employee.deptName" }
    }}
])

为此:

{ "_id" : ObjectId("53dbb05fa976627439d43884"), "deptName" : [ "y", "x" ] }

答案 1 :(得分:0)

好的,就你的情况而言,这不是一个简单的查询,而是一个聚合查询。如果我记得那个:

db.employee.aggregate([
    {
        $unwind : '$employee'
    }
    {
        $group : {
            _id : {
                id : '$_id',
                deptName : '$employee.deptName'
            }
        }
    },
    {
        $project : {
            _id : '$_id.id',
            deptName : '$_id.deptName'
        }
    },
    {
        $group : {
            _id : '$_id',
            deptName : { $addToSet : '$deptName' }
        }
    }
]);

unwind用于展开数组并为每个数组项生成一条记录。 group用于按_id和depName分组 project用于重新组织记录行 这次使用group重组所有记录并添加到An Array all uniqe deptName。

之后,你应该对所有记录进行检索:

{ 
    _id : ObjectId("53dbb05fa976627439d43884"),
    deptName : [ 'x', 'y' ]
}

我没有测试过这个聚合函数,但是,如果我记得,那应该是有效的。

编辑:我测试了它并且工作正常

对于聚合,结果如下:

{
    "result" : [ 
        {
            "_id" : ObjectId("54082a2463a023dbfa7d82fb"),
            "deptName" : [ 
                "x", 
                "y"
            ]
        }
    ],
    "ok" : 1
}