【问题标题】:mongodb: how to extract field instead of getting an object with aggregate + $lookup + $projectmongodb:如何提取字段而不是使用聚合 + $lookup + $project 获取对象
【发布时间】:2019-02-25 11:55:29
【问题描述】:

我有两份合同。

// UserInfo
{ _id: '1', name: 'Alice' }
{ _id: '2', name: 'Bob' }
{ _id: '3', name: 'Charlie' }

// Application
{ _id: '00', userId: '1', jobId: 'gg' }
{ _id: '01', userId: '1', jobId: 'fb' }
{ _id: '02', userId: '2', jobId: 'ms' }

我想得到:

{ name: 'Alice', jobIds: [ 'gg', 'fb' ] }
{ name: 'Bob', jobIds: [ 'ms' ] }
{ name: 'Charlie', jobIds: [] }

请注意,查理没有应用程序。

我当前的代码:

UserInfo.aggregate([
  {
    $lookup: {
      from: 'applications',
      let: { userId: '$_id' },
      pipeline: [
        {
          $match: {
            $expr: { $eq: ['$userId', '$$userId'] }
          }
        },
        {
          $project: { jobId: 1, _id: 0 }
        }
      ],
      as: 'jobIds'
    }
  }
])

我明白了:

{ _id: '1', name: 'Alice', jobIds: [ { jobId: 'gg' }, { jobId: 'fb' } ] }
{ _id: '2', name: 'Bob', jobIds: [ { jobId: 'ms' } ] }
{ _id: '3', name: 'Charlie', jobIds: [] }

如何获取jobIds: [ 'gg', 'fb' ] 而不是jobIds: [ { jobId: 'gg' }, { jobId: 'fb' } ]?

在Aggregation Pipeline Stages 中没有找到合适的方法。

【问题讨论】:

    标签: mongodb mongoose mongodb-query aggregation-framework


    【解决方案1】:

    在管道末端使用$addFields 阶段。

    UserInfo.aggregate([
      { "$lookup": {
        "from": "applications",
        "let": { "userId": '$_id' },
        "pipeline": [
          { "$match": { "$expr": { "$eq": ["$userId", "$$userId"] }}},
          { "$project": { "jobId": 1, "_id": 0 }}
        ],
        "as": "jobIds"
      }},
      { "$addFields": { "jobIds": "$jobIds.jobId" }}
    ])
    

    【讨论】:

    • 感谢您的及时回复!有用。一个问题是,为简单起见,UserInfo 中的许多字段都被省略了。最后加上你的$project,我必须为所有字段指定foo: 1。如果我向UserInfo 添加另一个字段,我还需要更改这个$project。有没有办法解决这个问题?
    • 改用$addFields...更新了答案
    猜你喜欢
    • 1970-01-01
    • 2019-11-08
    • 2021-04-11
    • 1970-01-01
    • 2020-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    相关资源
    最近更新 更多