Waterline / Sails.js / Mongo如何使用AND条件查询一个字段?

时间:2014-11-09 05:03:59

标签: sails.js waterline

我的问题与Waterline (Sails.js): AND conditions相同。有一个答案,但它对我不起作用(对于提问者而言)。

据我所知,水线在查询语言中没有关键字'和'。 如果我有多个条件要查询,我可以简单地使用:

MyModel.find({fieldA:valueA, filedB:valueB});

但我的问题是怎么做:

MyModel.find({fieldA:{
   contains:keyword1, 
   contains:keyword2
}});

因为我无法在Object / JSON中设置两个具有相同名称的键,所以我尝试了:

MyModel.find({fieldA:
  [
   {contains:keyword1}, 
   {contains:keyword2}
  ]
});

MyModel.find({fieldA:
  {contains:[keyword1,keyword2]}
});

MyModel.find()
.where({fieldA:{contains:keyword1})
.where({fieldA:{contains:keyword2}});

但它们都没有按预期工作:第一个和第二个返回空集,第三个只返回keyword2。 看来当你试图将两个'contains'条件添加到同一个字段(fieldA)时,使用链接'where'方法,第二个将覆盖第一个。

我正在使用本机mongoDB的方式来解决这个问题,Dose任何人都知道如何以水线方式执行此操作?或者这是一个问题应该在github上报告。

PS:抱歉我的英语不好:p

2 个答案:

答案 0 :(得分:4)

要回答您的问题,不支持多个contains。无论是遗漏还是功能请求都值得商榷。至少对于一个SQL案例,它是一个愚蠢的简单修复(虽然花了我一个多小时才能找到它)能够支持类似的东西:

orm.collections.user.find({
            and: [
                { name: { contains: 'neil' } },
                { name: { contains: 'armstrong' } }
            ]
        });

以下文件中所需要的只是case 'and':并且有效:

https://github.com/balderdashy/waterline-sequel/blob/master/sequel/lib/criteriaProcessor.js#L120

我怀疑Mongo案件是相似的。

答案 1 :(得分:4)

我找到了mongo数据库应该采用的方式。

您应该能够使用$and键在同一个字段上组合多个标准:

orm.collections.user.find({
        $and: [
            { name: { contains: 'neil' } },
            { name: { contains: 'armstrong' } }
        ]
    });

Sails-mongo源代码显示了这一点:

/**
 * Parse Clause
 *
 * <clause> ::= { <clause-pair>, ... }
 *
 * <clause-pair> ::= <field> : <expression>
 *                 | or|$or: [<clause>, ...]
 *                 | $or   : [<clause>, ...]
 *                 | $and  : [<clause>, ...]
 *                 | $nor  : [<clause>, ...]
 *                 | like  : { <field>: <expression>, ... }
 *
 * @api private
 *
 * @param original
 * @returns {*}
 */