我是NodeJS的新手,并且正在使用NodeJS Framework HapiJs。我有一个模型“元素”的父子模式,其中父项和子项属于同一集合。该架构类似于以下内容:

var mschema = new Schema({
    autoIncrementId: { type: Number,unique: true,index:true,sparse:true},
    elementName: {
        type: String,
        required: true
    },
    elementCanvasId: {
        type: String,
        required: true
    },
    parentId: {
        type: Schema.Types.ObjectId,
        required: false,
        ref: "Elements",
    },
    parentCanvasId: {
        type: String,
        required: false
    },
});

var modules = Mongoose.model('Elements', mschema);


在这里elementCanvasId是在客户端生成的。并且parentCanvasId是对父元素的elementCanvasId的引用。同样,每个元素都不必具有父元素。现在基于元素的elementCanvasId,我想在一维数组中获取该元素所属层次结构的所有元素(即其所有子元素,然后是子元素的子元素,然后是子元素的子元素等等)。我不能为此目的使用Schema.Types.ObjectId,因为我只需要使用仅在客户端生成的elementCanvasId。因此,有人可以帮我完成它。任何帮助都将不胜感激。提前致谢。

最佳答案

您需要使用$ graphLookup。由于$ graphLookup对集合执行递归搜索。

Elements.aggregate([{ $graphLookup : {
  from : 'elements', // MongoDB collection name not mongoose schema name
  startWith : '$parentCanvasId', //it is expression which can include can include field paths and system variables, literals, expression objects etc.
  connectFromField : 'elementCanvasId',
  as : 'children'
} }])


如果您只想获取一个元素的元素层次结构,则需要在聚合管道中使用$ match

Elements.aggregate([{ $match : { autoIncrementId : '1'  } }, { $graphLookup : {
  from : 'elements', // MongoDB collection name not mongoose schema name
  startWith : '$parentCanvasId',
  connectFromField : 'elementCanvasId',
  as : 'children'
} }])


注意:autoIncrementId:1是获取单个元素的结果的条件

10-06 06:08