Mongodb:具有空条件的聚合返回null

时间:2018-02-28 20:04:52

标签: mongodb mongoose aggregation-framework

我有一个跟随的查询。

module.exports.list = (req, res) => {
  let queryFilter = {};
  let where = {};

  if (req.query.filter) {
    queryFilter = JSON.parse(req.query.filter);
  }

  let pipeLine = [];

  if (queryFilter.lookupcompantype) {
    pipeLine.push({ "$lookup": queryFilter.lookupcompantype });
  }
  if (queryFilter.unwind) {
    pipeLine.push({ "$unwind": queryFilter.unwind });
  }

  if (queryFilter.where) {
    pipeLine.push({ "$match": queryFilter.where });
  }
  if (queryFilter.skip || queryFilter.limit) {
    pipeLine.push({ "$skip": queryFilter.skip });
    pipeLine.push({ "$limit": queryFilter.limit });
  } else if (queryFilter.all) {
    pipeLine.push({ "$count": "total" });
  }

  Company.aggregate(pipeLine)
    .then(list => res.json(list))
    .catch(err => res.json(err));
};

如果pipeLine不为空,则可以正常工作。如果pipeLine为空数组[],则返回null。

我想知道为什么?

如果我使用robomongo运行相同的查询,空数组正常工作

 MongoDB shell version v3.6.2
 MongoDB server version: 3.6.2
 mongoose : 4.13.9

1 个答案:

答案 0 :(得分:0)

在看不到输入的情况下很难说,但我的猜测是您在展开时缺少了preserveNullAndEmptyArrays选项。请参见以下示例:

$unwind: {
  path: '$someArray',
  preserveNullAndEmptyArrays: true,
},

如果数组中没有要展开的项目,它将保留根对象。

请参阅: https://docs.mongodb.com/manual/reference/operator/aggregation/unwind/