Mongoose:如何创建文档并同时将子数组推入其中

时间:2017-03-05 04:10:45

标签: javascript node.js mongodb asynchronous mongoose

我正在尝试为用户和用户朋友播放一个mongo数据库。

用户是它自己的模型(带有对模型的参考)。

我有两个数据数组用于为数据库设定种子。 friends数组包含子数组。每个子阵列-in order-包含相应用户阵列的朋友。 即friends [0]是用户[0]的朋友。

目标是创建用户,然后搜索以确定用户好友文档是否全部就绪。如果他们没有,请创建朋友文档,然后将其推送给该用户。

代码创建用户,但只创建朋友[0]中的朋友。它似乎与异步有关,但不知道下一步该去哪里。

zip

输出的最后一部分是随机的,每次运行都会发生变化。

1 个答案:

答案 0 :(得分:0)

我会将你的循环分成两个独立的任务。附:考虑不保存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();
});