如何编写使用其他字段的Mongoose查找查询,因为它是有条件的?

时间:2015-02-03 03:22:35

标签: mongodb mongoose

请考虑以下事项:

我有一个名为' Person'的Mongoose模型。在Person模式的模式中,每个Person都有两个字段:' children'和' maximum_children'。这两个字段都是Number。

我想编写一个查找查询,返回人员,当人们的孩子'价值低于它的“最大儿童数量”。值。

我试过了:

person_model.find({
    children: {
        $lt: maximum_children
    }
}, function (error, persons) {
    // DO SOMETHING ELSE
});

person_model.find({
    children: {
        $lt: 'maximum_children'
    }
}, function (error, persons) {
    // DO SOMETHING ELSE
});

我在尝试指定要比较的字段名称时做错了什么'孩子'对

2 个答案:

答案 0 :(得分:1)

行。

我在发布此问题后找到了解决方案。

答案似乎是:

person_model.find({
    $where: "children < maximum_children"}, function (error, persons)
}, {
    // DO SOMETHING ELSE
});

似乎工作正常,虽然看起来很乱。

答案 1 :(得分:0)

$where必须针对每个文档执行其JavaScript条件,因此其性能可能非常差。相反,您可以使用aggregate$project阶段添加新字段,指明文档是否匹配,然后对其进行过滤:

person_model.aggregate([
    {$project: {
        isMatch: {$lt: ['$children', '$maximum_children']},
        doc: '$$ROOT'
    }},
    {$match: {isMatch: true}},
    {$project: {_id: 0, doc: 1}}
], function(err, results) {...});

这使用$$ROOT将原始文档包含在投影的doc字段中,最后$project用于删除已添加的isMatch字段。< / p>

results看起来像:

{
    "doc" : {
        "_id" : ObjectId("54d04591257efd80c6965ada"),
        "children" : 5,
        "maximum_children" : 10
    }
}, 
{
    "doc" : {
        "_id" : ObjectId("54d04591257efd80c6965add"),
        "children" : 5,
        "maximum_children" : 6
    }
}

如果您要移除已添加的doc级别的对象,可以Array#map使用results,如下所示:

results = results.map(function(item) { return item.doc; });

results重新整形为原始形式:

{
    "_id" : ObjectId("54d04591257efd80c6965ada"),
    "children" : 5,
    "maximum_children" : 10
}, 
{
    "_id" : ObjectId("54d04591257efd80c6965add"),
    "children" : 5,
    "maximum_children" : 6
}