关于连接的MongoDB查询

时间:2017-12-24 09:14:17

标签: node.js mongodb join mongoose filter

这是一个抽象的例子,但如果有人可以帮助我解决它,我会永远感激。

我正在尝试根据相关记录中的字段进行搜索。在此示例中,我们有一个主题层次结构,使用parent_subject字段嵌套。这是我用过的Mongoose定义:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var subjectSchema = new Schema({
   url: { type: String, required: true, unique: true },
   title: { type: String, required: true, unique: true },
   parent_subject: this  
});
module.exports = mongoose.model('Subject', subjectSchema);

我的MongoDB中的一些记录:

{
  "_id" : ObjectId("5a3857f1afeb498c9533aef1"),
  "title" : "Sport",
  "url" : "sport",
  "__v" : 0
},
{
  "_id" : ObjectId("5a3d9a409c0973976f7889c6"),
  "title" : "Cycling",
  "__v" : 0,
  "parent_subject" : ObjectId("5a3857f1afeb498c9533aef1"),
  "url" : "cycling"
},
{
  "_id" : ObjectId("5a3d9a7e9c0973976f788b48"),
  "title" : "Mountain Biking",
  "__v" : 0,
  "parent_subject" : ObjectId("5a3d9a409c0973976f7889c6"),
  "url" : "mountain biking"
}

我想知道如何根据父记录中的字段查询此数据。例如,我想找到所有具有标题为“Sport”的父主题的主题。在SQL中,我将执行以下查询:

SELECT * 
FROM subject 
    INNER JOIN subject AS parentSubject
        ON subject.parent_subject = parentSubject.id
WHERE parentSubject.title = "Sport";

如何使用MongoDB实现这一目标?

2 个答案:

答案 0 :(得分:0)

您可以使用mongodb聚合管道并查找此

`Subject.aggregate([
  {
   $lookup:
     {
       from: "parentSubject",
       localField: "parent_subject",
       foreignField: "id"
       as: "parentSubject"
     }
},
{$unwind:"$parentSubject"},
{$match:{"$parentSubject.title":"Sport"}}
])`

有关详情,请参阅https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/index.html

答案 1 :(得分:-1)

mongoDB的意思是它是NOSQl,所以你也不能使用连接。 您最好的选择是首先获取parentSubject,它是id。 然后去寻找与id相关的主题。

由于您的数据已经有subject.parent_subject,因此应该非常容易。