请考虑以下事项:
我有一个名为' 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
});
我在尝试指定要比较的字段名称时做错了什么'孩子'对
答案 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
}