首页 > 解决方案 > 如何在 MongoDB 中将嵌套对象显示为超级对象?

问题描述

正如这里所说,我必须将引用对象保存在名为“item”的嵌套键中;

var userSchema = new Schema({
  name: String,
  connections: [{
    kind: String,
    item: { type: ObjectId, refPath: 'connections.kind' }
  }]
});

var organizationSchema = new Schema({ name: String, kind: String });

var User = mongoose.model('User', userSchema);
var Organization = mongoose.model('Organization', organizationSchema);

在我的数据库中,它更像是这样的:

var childSchema = new Schema({
    kind: String,
    item: {
        type: Schema.Types.ObjectId,
        refPath: 'children.kind'
    }
},{ _id : false, strict:false });

var schema = new Schema({
    name: String,
    kind: String,
    children: [childSchema]
},{
    strict: false
});

现在,它是一个基于树的文件夹结构模型,它可以有一个文件夹或一个叶子作为子对象。

我需要一个递归填充,所以我在 SO 上找到了答案,它变成了这样;

var autoPopulateChildren = function(next) {
    this.populate({path:'children.item', select:'name id children'});
    next();
};

schema.pre('findOne', autoPopulateChildren)
    .pre('find', autoPopulateChildren)

现在,当我进行find查询时,我得到了类似的示例;

{
  "name": "Some Folder",
  "children": [
    {
      "kind": "Leaf",
      "item": {
        "name": "First Level Leaf",
        "id": "5b61c85f25375fddf6048d3c"
      }
    },
    {
      "kind": "Folder",
      "item": {
        "name": "First Level Folder",
        "id": "5b61d844d77fb30b9537e5d1"
        "children": [
          {
            "kind": "Leaf",
            "item": {
              "name": "Second Level Leaf",
              "id": "5b61c85f25375fddf6048d3c"
            }
          }
        ]
      }
    }
  ],
  "id": "5b61c85f25375fddf6048d3d"
}

但是现在,我需要摆脱“善良”(不显示),并且我需要在小时候显示“项目”对象(它应该name代替item:{name:'a'}

{
  "name": "Some Folder",
  "children": [
    {
      "name": "First Level Leaf",
      "id": "5b61c85f25375fddf6048d3c"
    },
    {
      "name": "First Level Folder",
      "id": "5b61d844d77fb30b9537e5d1"
      "children": [
        {
          "name": "Second Level Leaf",
          "id": "5b61c85f25375fddf6048d3c"
        }
      ]
    }
  ],
  "id": "5b61c85f25375fddf6048d3d"
}

我怎样才能在autoPopulateChildren功能上做到这一点?

标签: javascriptnode.jsmongoosemongoose-populate

解决方案


推荐阅读