查询Mongoose中的嵌套属性(不带点表示法)

时间:2017-02-11 03:02:15

标签: javascript node.js mongodb mongoose

我正在尝试使用Mongoose查询MongoDB,以根据嵌套属性的值查找文档。

var Obj = new mongoose.Schema({
    mainProperty: {
      nestedProp1: String
      nestedProp2:String
    }
})

由于接收数据的方式,我需要在没有点表示法的情况下执行查询(如下所示)。

Obj.find({'mainProperty.nestedProp': 'value'})

上面的代码会得到正确的结果,但我需要以下面的格式传递查询条件。

Obj.find({ mainProperty: { nestedProp1: 'value' } })

我从客户端传递整个查询对象作为参数,而不是在服务器上开发查询。当它到达服务器时,上面的代码如下所示。

Obj.find(queryCondition)
//queryCondition holds a value of { mainProperty: { nestedProp1: 'value' } }

由于mainProperty中嵌套了两个属性,因此无法执行上述搜索。它将搜索mainProperty与冒号后传递的内容完全相同的文档(意味着值等于nestedProp1且没有nestedProp2的文档)。

是否有另一种方法来调用它(没有点符号或编辑对象本身),它将查询nestedProp1的值而不是mainProperty的值?

2 个答案:

答案 0 :(得分:0)

有,你可以做类似

的事情
const filter = {};

// check if you have specified nestedProp1
if ( req.body.nestedProp1 ) {
    filter['mainProperty.nestedProp1'] = req.body.nestedProp1;
}

if ( req.body.nestedProp2 ) {
    filter['mainProperty.nestedProp2'] = req.body.nestedProp2;
}

// and then
Obj.find( filter );

因此,如果您指定了过滤器,您将收到过滤记录,否则将收到默认记录。

我尚未测试代码,因此如果这不起作用,您可以尝试执行filter['mainProperty']['nestedProp1'] = req.body.nestedProp1;

答案 1 :(得分:0)

您可以将大多数Mongo DB语法与Mongoose #overlay { width: 100vw; position: relative; left: 50%; right: 50%; margin-left: -50vw; margin-right: -50vw; } 一起使用。试试这个:

find()

Mongo docs