猫鼬:如何按2个字段查找文档中存在一个字段而子文档中存在另一个字段的地方?

时间:2018-07-06 05:38:27

标签: node.js mongodb mongoose

下面是我的模式。

var prayerSchema = new Schema({
    totalSteps:{
      type: Number
    },
    name: String,
    steps: [{type: Schema.Types.ObjectId, ref:'Step'}]
});


var stepSchema = new Schema({
    stepNumber : {
       type: Number
    },
    _prayer : {
         type: Schema.Types.ObjectId, ref: 'Prayer', required: true
    } 
 });

每个祈祷都将有全部步骤,名字和步骤。
每个步骤将具有与之关联的stepNumber和祈祷模型。
步骤文档将如下所示:

{
   "stepNumber":1,
   _prayer:[
       "name":"prayer1",
       "totalSteps":5,
       "steps":[]
    ] 
 },
 {
    "stepNumber":2,
    _prayer:[
        "name":"prayer2",
        "totalSteps":10,
        "steps":[]
     ]   
  }

我试图按名称查询stepSchema的子文档(_prayer)和stepSchema的stepNumber中存在的名称。

Step.find({_prayer :{ name: req.query.name} }, {stepNumber: 1});
Step.find({'_prayer.name' : req.query.name, stepNumber: 1});

以上两个代码均无效。 我发现的一种方法是先按名称查询 Prayer 文档,然后获取其_id,然后通过找到的_id和stepNumber再次查询 Step 文档。

Prayer.findOne({name:"name"})
   .exec((err, prayers) => {

    Rakah.find({ _prayer: prayers._id, stepNumber: stepNumber })

    ....
});

但是这种方法对于嵌套文档将变得困难。 有什么方法可以只查询一个文档以获得结果吗?

1 个答案:

答案 0 :(得分:1)

两个过滤条件都应包含在find的一个对象中,如下所示:

Step.find({'_prayer.name' : req.query.name, stepNumber: 1 })

第二个参数代表投影部分,因此您仅获得_idstepNumber1意味着结果中应包含该字段)