如何在 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是获取单个元素结果的条件
我是 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是获取单个元素结果的条件