【问题标题】:Select a field in an array inside mongodb and display only unique field在 mongodb 内的数组中选择一个字段并仅显示唯一字段
【发布时间】:2014-10-28 22:23:18
【问题描述】:

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

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

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

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

    }
 ]
 }

就我而言,我想选择所有可用的唯一部门名称。输出如下所示。

  { deptName:x,
   deptName:y }

到目前为止,我已经尝试了以下命令,但没有成功。

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

【问题讨论】:

    标签: mongodb mongoose mongodb-query aggregation-framework


    【解决方案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" ] }
    

    【讨论】:

      【解决方案2】:

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

      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 重新组合所有记录并将所有uniqe deptName 添加到一个数组中。

      之后你应该为所有记录检索这个:

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

      我没有测试过这个聚合函数,但如果我记得的话,它应该可以工作。

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

      对于聚合,结果是这样的:

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

      【讨论】:

      • 是的,它确实为每个文档提供了不同的值。但是你走了很长的路才到这里。这实际上比您介绍的要简单得多。
      • 你说得对,我将我的聚合请求复杂化了
      猜你喜欢
      • 2014-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-27
      相关资源
      最近更新 更多