Mongodb Mongoose.js-与平常不同的种群
我从集合“main”中获得了以下简化文档: 以下是我的“菜单”收藏中的简化文档: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
{
_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' } } ]