填充MongooseJS中的子文档数组

时间:2014-03-07 20:27:34

标签: javascript node.js mongoose

我很难用MongooseJS填充一系列子文档。有人可以帮忙吗?

这是user.js:

var mongoose = require("mongoose");

var userSchema = new mongoose.Schema({
    name: {
        type: String
    },
    positions: {
        type: [mongoose.Schema.ObjectId],
        ref: 'position'
    }
});

userSchema.statics.getUserByID = function (id, callback){
    return this.findOne({_id: id}).populate('positions').exec(callback);
};

var user = mongoose.model('user', userSchema);

module.exports = user;

这里是position.js

var mongoose = require("mongoose");

var positionSchema = new mongoose.Schema({
    modifiedDate: {
        type: Date
    },
    location: {
        type: [Number], 
        index: '2d'
    }
});

var position = mongoose.model('position', positionSchema);

module.exports = position;

调用getUserByID时,未填充用户模式的位置数组。我错过了一些明显的东西吗?

修改

根据下面的答案,我已将用户架构更改为:

var mongoose = require("mongoose");

var userSchema = new mongoose.Schema({
    name: {
        type: String
    },
    positions: [{
        type: mongoose.Schema.ObjectId,
        ref: 'position'
    }]
});

userSchema.statics.getUserByID = function (id, callback){
    return this.findOne({_id: id}).populate('positions').exec(callback);
};

var user = mongoose.model('user', userSchema);

module.exports = user;

我还从位置模式中删除了location属性,以防有些奇怪的事情发生在那里。

我尝试过的任何东西似乎都没有任何区别。

以下是users集合中当前保存的内容:

{
    "__v": 1,
    "_id": {
        "$oid": "531f8ab89938130200433ef8"
    },
    "modifiedDate": {
        "$date": "2014-03-11T22:14:43.174Z"
    },
    "name": "Josh",
    "positions": [
        {
            "$oid": "531f8ad39938130200433efa"
        }
    ]
}

以下是positions集合中的内容:

{
    "modifiedDate": {
        "$date": "2014-03-11T22:14:43.163Z"
    },
    "_id": {
        "$oid": "531f8ad39938130200433efa"
    },
    "__v": 0
}

供参考我在"mongoose": "^3.8.8"文件中使用package.json

我真的很难过,任何帮助都会受到赞赏。

3 个答案:

答案 0 :(得分:4)

您在用户架构中犯了一个小而重要的拼写错误 - position字段的类型不应设置为ObjectId的数组。你可能想要的是这个架构:

var userSchema = new mongoose.Schema({
    name: {
        type: String
    },
    positions: [{
        type: mongoose.Schema.ObjectId,
        ref: 'position'
    }]
});

答案 1 :(得分:3)

尝试使用" mongoose.Schema.Types.ObjectId"而不是" mongoose.Schema.ObjectId",我前段时间遇到了类似的问题。但我肯定不会对你的情况有所帮助。

答案 2 :(得分:1)

我没有进一步的前锋。

我重构了所有内容,以便我可以直接查询子文档而不是依赖于populate方法。