2

使用猫鼬,我想在我的主文档的子文档中填充一个属性。这是我的模型:

var device = {
    deviceId: {type: String, required: true},
    number: {type: Number, default: 0}
};

var notification = new Schema({
   createdAt: {type: Date, default: Date.now},
   device: {type: Schema.ObjectId, ref: 'Device'}
});

var clientSchema = new Schema({
    [...]
    information: {
        code: {type: String, required: true},
        name: {type: String, required: true}
    },
    notifications: [notification],
    [...]
});

我正在尝试做的是在填充设备的情况下获取通知。

我试过这个:

 clientModel.findOne({"information.code": id})
      .populate('notifications')
      .populate('notifications.device')
      .exec(function(err, client) {
          if (err) {
              console.log(err);
              next(err, null);
          }
          if (client) {
              console.log(client.notifications);
              next(null, client.notifications);
          }
      });

我得到了这个

[{ device: 55634975d20f1f3903ff4325,
   _id: 5564b1139ac484db0251b4a2,
   createdAt: Tue May 26 2015 19:44:51 GMT+0200 (CEST) }]

任何人都可以告诉我我做错了什么吗??谢谢你们的帮助:)

4

2 回答 2

0

在您的 clientSchema 通知中是嵌入的,因此您不需要填充它。尝试删除查询中的 populate('notifications')。您应该只需要 populate('notifications.device')。

于 2015-06-11T22:37:45.777 回答
0

正确的填充方法是:

clientModel.findOne({"information.code": id})
      .populate('notifications.device')
      .exec(function(err, client) {
          if (err) {
              console.log(err);
              next(err, null);
          }
          if (client) {
              console.log(client.notifications);
              next(null, client.notifications);
          }
      });

请注意,使用.populate('notifications')是不必要的,因为通知不是引用而是嵌入 。这条线可能会导致问题。

于 2016-04-06T22:27:48.860 回答