Mongodb Mongoose.js-与平常不同的种群

Mongodb Mongoose.js-与平常不同的种群,mongodb,mongoose,mongoose-populate,Mongodb,Mongoose,Mongoose Populate,我从集合“main”中获得了以下简化文档: 以下是我的“菜单”收藏中的简化文档: { _id: 5, menuItems: [an array of elements here], menuProperties: {an object here} } 是否可以使用mongoose.js将“菜单”文档填充到“主”文档中,从而生成以下模型对象: { _id: 120, name: "Main1", prop1: "val", menuItem

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

以下是我的“菜单”收藏中的简化文档:

{
    _id: 5,
    menuItems: [an array of elements here],
    menuProperties: {an object here}
}
是否可以使用mongoose.js将“菜单”文档填充到“主”文档中,从而生成以下模型对象:

{
    _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}
            }
}
我没有添加方案,因为它们非常简单,并且将包含
menuId
ref

谢谢

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

此外,mongoose是一种内置的填充方法,可以用来实现这一点。你可以在这里找到这些文档


使用populate可能比在一堆异步调用上循环(或者重新编写上述代码以同步处理更新)要好得多。但是你可以用任何对你的db最有意义的方式来处理

一种方法是从填充结果中删除
menuId
,并将
menuItem
menuperties
添加到填充结果中。以下是示例代码

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' } } ]

感谢您的努力,但我需要将
菜单
文档填充到
文档中。我还需要
菜单
的属性与'main'的属性处于同一级别。上述代码遍历所有菜单文档。对于每个菜单文档,它会找到匹配的主文档。然后用菜单文档信息填充主文档。这不是你想要的吗?谢谢你的回答,我认为这不是使用
doc.toJSON()
您可以在调用
.exec()
之前添加
.lean()
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' } } ]