如何在 Mongoose MongoDb NodeJS 的数组中获取集合中的连接对象

How to get the connected objects within a collection in an array in Mongoose MongoDb NodeJS

我是 NodeJS 的新手,我正在使用 NodeJS Framework HapiJs。我有一个模型 "Elements" 的父子模式,其中父子属于同一个集合。该架构类似于以下内容:

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,但是它只能从3.4+版本开始使用,它变得相当复杂

有关完整详细信息,请参阅 https://docs.mongodb.com/v3.4/reference/operator/aggregation/graphLookup/

Elements.aggregate( [
   {
      $graphLookup: {
         from: "elements",
         startWith: "$parentCanvasId",
         connectFromField: "parentCanvasId",
         connectToField: "elementCanvasId",
         as: "elementHierarchy"
      }
   }
] )

您需要使用 $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是获取单个元素结果的条件