我从“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
。
谢谢!
答案 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
,并将menuItem
和menuProperties
添加到总体结果中。以下是示例代码
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' } } ]