[英]Mongoose: How to create a document and simultaneously push a sub array into it
我正在嘗試為用戶和用戶朋友播種mongo數據庫。
用戶是它自己的模型(帶有對Friends模型的引用)。
我有兩個數據數組可用於播種數據庫。 friends數組包含子數組。 每個子數組(按順序)包含相應用戶數組的好友。 即friends [0]是用戶[0]的朋友。
目標是創建用戶,然后搜索以確定用戶的朋友文檔是否已准備就緒。 如果沒有,請創建好友文檔,然后將其推送給該用戶。
該代碼創建用戶,但僅從friends [0]創建朋友。 它似乎與異步有關,但不知道下一步該怎么做。
function doSomething(){
var i = 0;
userArray.forEach(function(user){
User.create(user, function(err, createdUser){
if(err){
console.log(err);
}
console.log(createdUser.name + ' created!');
var incrementer = 0;
for(let friend of friends[i]){
Friend.find({name: friend.name}, function(foundFriend){
if(foundFriend == undefined){
Friend.create(friend, function(err, createdFriend){
createdUser.friends.push(createdFriend);
createdUser.save;
console.log(createdFriend.name + ' added to' + createdUser.name + ' friends!');
incrementer++;
if(incrementer === friends[i].length){
i++;
}
});
}
});
}
});
});
}
//Output I would expect (assuming no documents exist)
//John Smith created!
//Sally added to John Smith friends
//Mike added to John Smith friends
//Mary Doe created!
//Bob added to Mary Doe friends!
//Gary added to Mary Doe friends!
//Instead I am getting (assuming no matching documents exist)
//John Smith created!
//Mary Doe created!
//Sally added to John Smith friends!
//Sally added to Mary Doe friends!
//Mike added to Mary Doe friends!
//Sally added to Mary Doe friends!
輸出的最后一部分是隨機的,並且隨每次運行而變化。
我會將您的循環分成兩個單獨的任務。 PS考慮不保存user.friends
而是保存user.friendsIDs
(更常見)
var users = [ {name: 'user 1'}, {name: 'user 2'} ]; var friends = [ [{name: 'Alex'}, {name: 'John'}], [{name: 'Alex'}, {name: 'Max'}] ]; // save all friends first var flattenFriends = [].concat.apply([], friends); var names = []; var filteredFriends = flattenFriends.filter(function(friend, i) { if(names.indexOf(friend.name) > -1) return false; names.push(friend.name); return true; }); filteredFriends.forEach(function(friend) { Friend.find({name: friend.name}, function(found) { if(!found) { var newFriend = new Friend(friend); newFriend.save(); } }); }); // save all users (with friends) users.forEach(function(user, i) { var user = user; user.friends = []; friends[i].forEach(function(friend, j) { Friend.find({name: friend.name}, function(found) { user.friends.push(found) }) }); var newUser = new User(user); newUser.save(); });
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.