$ project拆分字符串并过滤空值

时间:2018-08-26 23:50:36

标签: mongodb aggregation-framework

是否可以拆分字符串,然后从生成的数组中删除空值?

我已经尝试过,但是path的值是数组数组,而不是字符串数组

我假设通过使用数组将按顺序执行该命令,但似乎并没有这样做...

这在 $ project 中:

{
  path: [
    {
      $split: ['$filename', '/']
    }, {
      $filter: {
        input: '$path',
        as: 'str',
        cond: {
          $ne: ['$$str', '']
        }
      }
    }
  ]
}

一些示例文档:

{ filename: '/a/b/c.txt' }
{ filename: '/abc/123.txt' }
{ filename: '/path/to/file.txt' }

当前输出:

{
  path: [
    ['', 'a', 'b', 'c.txt'],
    null
  ]
}

我想要:

{
  path: ['a', 'b', 'c.txt']
}

我可以使用两个 $ project 阶段来实现这一点,但这似乎是多余的。是否可以分一个阶段进行?

1 个答案:

答案 0 :(得分:3)

您想做的事情可以在单个$project阶段完成

exports.seed = function(knex, Promise) {
  // Deletes ALL existing entries
  return knex('user_goingto_events').del()
    .then(function () {
      // Inserts seed entries
      return knex('user_goingto_events').insert([
        {id: 1, user_id: 1, event_id: 1},
        {id: 2, user_id: 1, event_id: 2},
        {id: 3, user_id: 1, event_id: 3},
        {id: 4, user_id: 2, event_id: 4},
        {id: 5, user_id: 2, event_id: 5},
        {id: 6, user_id: 2, event_id: 6}
      ])
    })
}

或者使用 $slice$split聚合

exports.seed = function(knex, Promise) {
  // Deletes ALL existing entries
  return knex('user_interestedin_events').del()
    .then(function () {
      // Inserts seed entries
      return knex('user_interestedin_events').insert([
        {id: 1, user_id: 1, event_id: 4},
        {id: 2, user_id: 1, event_id: 5},
        {id: 3, user_id: 1, event_id: 6},
        {id: 4, user_id: 2, event_id: 1},
        {id: 5, user_id: 2, event_id: 2},
        {id: 6, user_id: 2, event_id: 3}
      ])
    })
}