Mongoose Populate子阵列

时间:2017-12-20 09:00:36

标签: node.js mongodb mongoose bluebird mongoose-populate

我有以下架构:

var UserSchema = new Schema({
    fb_id: String,
    subscriptions: [{ type: Schema.Types.ObjectId, ref: 'Subscription' }]
});

var SubscriptionSchema = new Schema({
    asin: String,
    price: Number,
    user: { type: Schema.Types.ObjectId, ref: 'User' }
}, { timestamps: true });

该数据库包含以下文件:

用户

{
    "_id": {
        "$oid": "5a397dd97d6682fb0aeb1a01"
    },
    "fb_id": "99999999999999",
    "__v": 0
}

订阅

{
    "_id": {
        "$oid": "5a397dd94ee7e13f43fefa42"
    },
    "updatedAt": {
        "$date": "2017-12-19T21:00:09.199Z"
    },
    "createdAt": {
        "$date": "2017-12-19T21:00:09.199Z"
    },
    "asin": "ABCDEFGHI001",
    "price": 0.98,
    "user": {
        "$oid": "5a397dd97d6682fb0aeb1a01"
    },
    "__v": 0
}

为什么这个功能:

const test = (userId) => {
    User.findOne({ fb_id: userId }).populate('subscriptions').exec()
        .then((result) => {
            console.log(result);
        })
        .catch((error) => {
            console.log(error);
        });
};

始终返回具有空订阅数组的用户?非常感谢提前。

P.S。我正在使用蓝鸟承诺与猫鼬。

2 个答案:

答案 0 :(得分:0)

您已将用户ID放入订阅中,这意味着如果您要获取订阅并填充用户,您将获得订阅用户数量的订阅。

示例中的用户文档没有任何与之关联的订阅,因此不会填充任何内容。

创建用户时,您需要将订阅添加到文档中。 E.g。

let newUser = new User({
    db_id:"99999999999999",
    subscriptions:["5a397dd94ee7e13f43fefa42"]
});

答案 1 :(得分:0)

从猫鼬4.5开始,您可以使用虚拟填充https://mongoosejs.com/docs/populate.html#populate-virtuals来完成此操作。

const UserSchema = new Schema({
  fb_id: String,
});

const SubscriptionSchema = new Schema({
  asin: String,
  price: Number,
  user: { type: Schema.Types.ObjectId, ref: 'User' },
});

UserSchema.virtual('subscriptions', {
  ref: 'Subscription',
  localField: '_id',
  foreignField: 'user',
});