【问题标题】:Mongoose: How to find by 2 fields where one field exists in document and other in sub-documents?Mongoose:如何通过 2 个字段查找一个字段存在于文档中,另一个存在于子文档中?
【发布时间】:2018-12-14 15:54:50
【问题描述】:

下面是我的架构。

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 })

    ....
});

但是这种方法对于嵌套文档会变得困难。 有没有办法只通过一个文档来查询得到结果?

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

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

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

    第二个参数代表投影部分,因此您只得到_idstepNumber1 表示该字段应包含在结果中)

    【讨论】:

    • 编辑了该行。但结果还没有到来。像这样的猫鼬调试显示;猫鼬:rakahs.find({ '_prayer.name': 'Fajr', rakahNumber: 1 },
    • @Sulaiman 您的架构中没有rakahNumber。你为什么要按这样的字段过滤?
    • 抱歉是stepNumber
    • @Sulaiman 你可以在这里查看:mongoplayground.net/p/LDVK6nESFXv
    • 在 mongo 操场上工作正常,但在我的代码中不工作。谢谢你的帮助。我的猫鼬版本是 5.2.1
    猜你喜欢
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2023-02-11
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 2016-12-14
    相关资源
    最近更新 更多