Mongoose聚合,不能动态添加someField:{$ not;空值 }

时间:2018-01-03 21:33:45

标签: mongodb mongoose

我根据用户对条件的输入生成查询。用户可以通过选择来设置自定义过滤。

到目前为止,一切都还好。例如,这有效:

exports.getJoinedTransactions = function(firmId, page, pageSize, billerId, matterId, words, billingStatus, cb) {

    let firmIdToObjId = new mongoose.Types.ObjectId(global.user.firmId);
    let query = { firmId: firmIdToObjId };

    if ( typeof billerId === "object" ) {
        billerId = new mongoose.Types.ObjectId(billerId);
        query.contactId = billerId;
    }

    if ( typeof matterId === "object" ) {
        matterId = new mongoose.Types.ObjectId(matterId);
        query.matterId = matterId;
    }

    ....

    myAggregate = [
        { $sort: { date: -1 } },
        {
            $match: query
        },

    ....

    Transactions.aggregate(myAggregate).exec( function(err, transactions) {

        if (err) {
            console.log(err);
        }

        someVar = transactions.length;

    ....

这可以很好地构建查询并运行良好。但是,现在添加到列表的要求略有不同。我想还包括null或非null的可能查询。像这样:

if (typeof billingStatus === "string" && billingStatus != "") {

    if (billingStatus === "billed") {
        query.billId = { $not: null } ;          <-- This does not work.
    } else if (billingStatus === "unbilled") {
        query.billId = null;                     <-- This works!
    }
}

当我运行此代码时,将状态设置为&#34; billed,&#34;没有错误被抛出。然而,没有&#34;交易&#34;也被退回。抛出错误:&#34;无法读取属性&#39;长度&#39;未定义的。&#34;

如何修复破损的部分?

编辑:顺便说一句,共有5条记录,其中1条是结算。当它工作时,我应该收到1条记录。

1 个答案:

答案 0 :(得分:1)

有一个特殊的$type运算符,可以让您检查属性类型。因此,如果集合中有明确的空值,则它们的类型为10。完整的类型代码列表here。因此,要检查属性是否不等于null,您可以使用以下查询。

db.transactions.aggregate([
    {
        $match: {
            billId: {  $not: { $type: 10 } }  
        }
    }
])