需要在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})
答案 0 :(得分:1)
聚合框架可能是你的方式,但是如果你只是在整个集合中使用不同的值,那就是.distinct()
方法:
db.collection.distinct("employee.deptName")
哪个输出:
["x","y"]
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
}