Mongoose.js - 与平时不同的人口

时间:2016-03-28 15:32:43

标签: mongodb mongoose mongoose-populate

我从“main”集合中得到以下简化文档:

{
    _id: 120,
    name: "Main1",
    prop1: "val",
    menuId: 5
}

以下是我的“菜单”集合中的简化文档:

{
    _id: 5,
    menuItems: [an array of elements here],
    menuProperties: {an object here}
}

是否可以使用mongoose.js将“menu”文档填充到“main”文档中,从而产生以下模型对象:

{
    _id: 120,
    name: "Main1",
    prop1: "val",
    menuItems: [an array of elements here],
    menuProperties: {an object here}
}

我现在能做到的是:

{
    _id: 120,
    name: "Main1",
    prop1: "val",
    menuId: {
               menuItems: [an array of elements here],
               menuProperties: {an object here}
            }
}

我没有添加方案,因为它们非常简单,并且ref包含menuId。 谢谢!

2 个答案:

答案 0 :(得分:2)

有很多方法可以做到这一点。你总是可以这样做(注意,你没有发布你的模式,所以我编写了名字):

//get every document in menu collection
Menu.find({}).exec(function(err,all_menuItems){

    if (err) {throw err};

    //for all documents in them meny collection
    //find docuement in main collection and update

    all_menuItems.forEach(function(item){

        //wrapping in closure since doing forEach over async function
        function(){

            Main.findOne({_id:item._id}).exec(function(err,mainItem){

            if (err) {throw err};

            //set properties
            mainItem.menuItems = item.menuItems;
            menuItem.menuProperties = item.menuProperties;
            //save document
            Main.save(mainItem)

            })

        }(item)
    })

})

此外,mongoose作为内置的populate方法,可用于执行此操作。你可以在这里找到这些文档。 http://mongoosejs.com/docs/populate.html

使用populate可能是比循环一堆异步调用(或重写上面的代码以同步处理更新)更好的选择。但是你可以处理对你的db最有意义的方法。

答案 1 :(得分:1)

一种方法是从人口结果中删除menuId,并将menuItemmenuProperties添加到总体结果中。以下是示例代码

Main.find()
    .populate('menuId', 'menuItem menuProperties -_id', 'Menu')
    .exec(function(err, docs){
        if (err)
            console.log(err);
        else {
            var rets = [];
            docs.forEach(function(doc) {
                // converts the mongoose document into a plain javascript object
                doc = doc.toJSON();
                // add menuItem key
                if (doc.menuId && doc.menuId.menuItem) {
                    doc.menuItem = doc.menuId.menuItem;
                }
                // add menuProperties key
                if (doc.menuId && doc.menuId.menuProperties) {
                    doc.menuProperties = doc.menuId.menuProperties;

                    // remove the menuId object
                    delete doc.menuId
                }
                rets.push(doc);
            });

            console.log(rets);
        }
    });

使用架构测试

var MainSchema = new mongoose.Schema({
    name: String,
    prop1: String,
    menuId: Number
});

var MenuSchema = new mongoose.Schema({
    _id: Number,
    menuItem: [String],
    menuProperties: {k: String}
});

var Main = mongoose.model('Main', MainSchema);
var Menu = mongoose.model('Menu', MenuSchema);

结果是

[ { _id: 56fa39b4924d1254272ac3f1,
    name: 'main1',
    prop1: 'val',
    __v: 0,
    menuItem: [ 't1', 't2' ],
    menuProperties: { k: 'p1' } } ]