Mongoose Relationship Populate不返回结果

时间:2013-09-02 18:29:34

标签: node.js mongodb mongoose

    var SecuritySchema = new Mongoose.Schema({
        _bids: [{
            type: Mongoose.Schema.Types.ObjectId,
            ref: 'BuyOrder'
        }],
        _asks: [{
            type: Mongoose.Schema.Types.ObjectId,
            ref: 'SellOrder'
        }]
    });

    var OrdersSchema = new Mongoose.Schema({
        _security: {
            type: Mongoose.Schema.Types.ObjectId,
            ref: 'Security'
        },
        price: {
            type: Number,
            required: true
        },
        quantity: {
            type: Number,
            required: true
        }
    });


    // declare seat covers here too
    var models = {
        Security: Mongoose.model('Security', SecuritySchema),
        BuyOrder: Mongoose.model('BuyOrder', OrdersSchema),
        SellOrder: Mongoose.model('SellOrder', OrdersSchema)
    };
    return models;

比我保存一个新的BuyOrder例如:

// I put the 'id' of the security: order.__security = security._id on the client-side
var order = new models.BuyOrder(req.body.order);
    order.save(function(err) {
        if (err) return console.log(err);
    });

并尝试重新检索相关的安全性:

models.Security.findById(req.params.id).populate({
        path: '_bids'
    }).exec(function(err, security) {
        // the '_bids' array is empty.
    });

我认为这是某种命名问题,但我不确定,我已经看过示例here并且在使用Number作为Id类型的moongoose网站上:http://mongoosejs.com/docs/populate.html

2 个答案:

答案 0 :(得分:0)

ref字段应使用单数型号名称

另外,只需:

models.Security.findById(req.params.id).populate('_bids').exec(...

我现在主要怀疑你的代码片段是你的req.body.order _security字符串而不是包含字符串的数组。

此外,您不需要id属性。 Mongodb本身会自动将_id作为真正的BSON ObjectId,而mongoose会将id添加为相同值的字符串表示,所以不要担心。

答案 1 :(得分:-1)

虽然我不理解你的架构(以及它的循环特性?),但这段代码可以工作:

var order = new models.BuyOrder({ price: 100, quantity: 5});
order.save(function(err, orderDoc) {
    var security = new models.Security();
    security._bids.push(orderDoc);
    security.save(function(err, doc) {
       models.Security.findById({ _id: doc._id })
           .populate("_bids").exec(function(err, security) {
              console.log(security);

           });
    });
});

有:

  1. 创建BuyOrder
  2. save s it
  3. 创建Security
  4. 添加_bidsorderDoc的{​​{1}}
  5. 数组
  6. 保存
  7. 搜索匹配并填充
  8. 请注意,没有将文档添加到_bids数组的自动方法,所以我手动完成了。

    结果:

    _id