嵌套在Mongoose中的集合关联

时间:2017-07-14 11:42:59

标签: node.js mongodb mongoose mongodb-query nosql

我对收藏品的关联有问题 我花了2天仍然没有解决问题,这对我来说是新的。

我的模特:

// Schema opened cases
const openedSchema = new Schema({
  user: {
    type: Schema.Types.ObjectId,
    ref: 'user',
    required: [true, 'user is required'],
    index: true
  },
  weapon: {
    type: Schema.Types.ObjectId,
    ref: 'cases.weapons',
    required: [true, 'weapon is required'],
    index: true
  },
  sellPrice: {
    type: Number,
    default: null
  },
  status: {
    type: Number,
    default: 0
  }
}, {
  timestamps: true
});

const opened = mongoose.model('opened', openedSchema);

// list cases
const casesSchema = new Schema({
  name: {
    type: String,
    unique: true,
    required: [true, 'name is required']
  },
  price: {
    type: Number,
    required: [true, 'price is required']
  },
  weapons: [ {
    weapon: {
      type: Schema.Types.ObjectId,
      ref: 'weapon',
      index: true
    }
  } ]
}, {
  timestamps: false
});

const cases = mongoose.model('cases', casesSchema);

// list weapons

const weaponSchema = new Schema({
  name: {
    type: String,
    unique: true,
    required: [true, 'name is required']
  },
  price: {
    type: Number,
    required: [true, 'price is required']
  },
  autoship: {
    count: Number,
    status: Boolean,
    price: Number
  }
}, {
  timestamps: false
});

const weapon = mongoose.model('weapon', weaponSchema);

这就是文件的样子

// cases
{
    "_id": {
        "$oid": "59653bcfa9ac622e1913e10c"
    },
    "name": "test case #1",
    "price": 256,
    "weapons": [
        {
            "weapon": {
                "$oid": "59653bcfa9ac622e1913e10b"
            },
            "_id": {
                "$oid": "59653bcfa9ac622e1913e10d"
            }
        },
        {
            "_id": {
                "$oid": "59653d3279aeda2fda9fb490"
            },
            "weapon": {
                "$oid": "59653c5d069f562eb0ba4ef3"
            }
        },
        {
            "_id": {
                "$oid": "59653d38ba04de2fdddc459f"
            },
            "weapon": {
                "$oid": "59653c893a772e2ef7b65a29"
            }
        }
    ],
    "__v": 0
}
// opened
{
    "_id": {
        "$oid": "5965d134c8c95972a1a498f5"
    },
    "updatedAt": {
        "$date": "2017-07-12T07:35:16.419Z"
    },
    "createdAt": {
        "$date": "2017-07-12T07:35:16.419Z"
    },
    "user": {
        "$oid": "5965d0d6ea9db872360db98b"
    },
    "weapon": {
        "$oid": "59653bcfa9ac622e1913e10d"
    },
    "status": 0,
    "sellPrice": null,
    "__v": 0
}
// weapon
{
    "_id": {
        "$oid": "59653bcfa9ac622e1913e10b"
    },
    "name": "AWP | Fever Dream",
    "price": 300,
    "autoship": {
        "status": true,
        "price": 167,
        "count": 5
    },
    "__v": 0
}

我需要获得一份武器数据公开案例清单 打开 - >案例 - >武器
所以,我这样做:

 opened.find()
 .populate('cases.weapons')
    .then(_opened => {
      console.log(_opened);
    })
    .catch(err => {
      logger.error(err);
    });

但是populate不起作用。

1 个答案:

答案 0 :(得分:0)

除非我弄错了,否则openedSchemacasesSchema之间没有任何关系。

不是opened -> cases -> weapon而是opened -> weapon,因为openedSchema没有名为cases的字段 - 这意味着永远不会填充cases

根据您的架构定义,它应该是opened.find().populate('weapon')