简体   繁体   中英

Populate not working for an array of ObjectIDs

This is the implementation of my models :

var itemSchema = new Schema({
    name : String,
    qte : Number
});

var Item = mongoose.model('Item', itemSchema);    

var orderSchema = new Schema({
    state : {
        type: String,
        enum: ['created', 'validated', 'closed', 'starter', 'meal', 'dessert'],
        required : true
    },
    table : {
        number : {
            type : Number,
            required : true
        },
        name : {
            type : String,
            required : false
        }
    },
    date: { type: Date, default: Date.now },
    _items : [{type:Schema.Types.ObjectId, ref:'Item'}]
});

And this is how I do my query

getByIdRaw : function (orderId, callback) {
            Order.findById(orderId)
            .populate('_items')
            .exec(function(err, order) {
                debug(order);
                callback(order);
            });
        }

This is my response without populating

{
    _id: "5549e17c1cde3a4308ed70d5"
    state: "created"
    _items: [1]
        0:  "5549e1851cde3a4308ed70d6"
    -
    date: "2015-05-06T09:40:12.721Z"
    table: {
        number: 1
    }-
    __v: 1
}

...and my response when populating _items

{
    _id: "5549e17c1cde3a4308ed70d5"
    state: "created"
    __v: 1
    _items: [0]
    date: "2015-05-06T09:40:12.721Z"
    table: {
       number: 1
    }-
}

Why the _items array is empty ? What am I doing wrong ?

EDIT : the addItem function

addItem : function (orderId, item, callback) {
            Order.findById(orderId)
            .exec(function(err, order) {
                if (err) {
                    error(err);
                    return callback(err);
                }
                if (order === null) {
                    return callback("No order with this id");
                }

                var newItem = new Item({
                    name : item.name,
                    qte :item.qte
                });
                order._items.push(newItem);
                order.markModified('_items');
                order.save();
                callback();
            });
        }

The issue is the new item is never persisted to the items collection. Mongoose references only populate they don't persist a new item to the referenced collection.

 addItem: function(orderId, item, callback) { var newItem = new Item({ name: item.name, qte: item.qte }); newItem.save(function(err, savedItem) { if (err) { error(err); return callback(err); } Order.findById(orderId).exec(function(err, order) { if (err) { error(err); return callback(err); } if (order === null) { return callback("No order with this id"); } order._items.push(savedItem); order.markModified('_items'); order.save(callback); }); }); } 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM