使用护照注册后将代表用户的对象添加到数组中

Posted

技术标签:

【中文标题】使用护照注册后将代表用户的对象添加到数组中【英文标题】:adding an object that represents users to an array after signup using passport 【发布时间】:2016-05-19 22:12:08 【问题描述】:

我正在尝试制作一个用户名和密码列表,以便当用户使用他们的凭据登录时,他们可以看到其他人看到的所有数据,但他们仍然必须使用自己的凭据。我想制作一个像users : [username : "user1", password : "pass1", username : "user2", password : "pass2"] 这样的对象列表。这应该在注册时创建。我虽然subdocs 会有所帮助,但我没有得到我想要的。我有这个:

var userlist = new mongoose.Schema(username: String, password : String )
var userSchema = new mongoose.Schema(
    users : [userlist]
)

我尝试像这样将新用户添加到数组中:

app.post("/signup", function(req, res)
    var user = new User;
    user.users.push(username : req.body.username, password : req.body.password)
    user.save(function(err)
        if(err) return handleError(err);
        console.log("success")
    )
    // User.create(users : [username : req.body.username, password : req.body.password], function(err, doc)
    //  console.log(doc);

    // )
    res.redirect("/login")
)

这给了我这个

> db.users.find().pretty()

        "_id" : ObjectId("56ba6219763de71c03199a70"),
        "users" : [
                
                        "username" : "user1",
                        "password" : "pass1",
                        "_id" : ObjectId("56ba6219763de71c03199a71")
                
        ],
        "__v" : 0


        "_id" : ObjectId("56ba6225763de71c03199a72"),
        "users" : [
                
                        "username" : "user2",
                        "password" : "pass2",
                        "_id" : ObjectId("56ba6225763de71c03199a73")
                
        ],
        "__v" : 0

>

它正在制作单独的文档。我希望它看起来像这样


        "_id" : ObjectId("56ba6219763de71c03199a70"),
        "users" : [
                
                        "username" : "user1",
                        "password" : "pass1",
                        "_id" : ObjectId("56ba6219763de71c03199a71")
                ,                    
                
                        "username" : "user2",
                        "password" : "pass2",
                        "_id" : ObjectId("56ba6225763de71c03199a73")
                
        ],
        "__v" : 0

在子文档中包含 objectID 对我来说并不重要。我只想将所有用户分组在一起,这样当他们登录时,我可以做一些事情,比如如果文档在那里,凭据是好的,所以继续访问网站的其他部分。

【问题讨论】:

【参考方案1】:

我不确定您现在是否已经解决了您的问题,不管这里是您问题的答案。

首先,如果您在subdocument 中不需要_id,则相应地在schema 中声明,并且不会创建_id

var userSchema = new Schema( username: String, password: String, _id: false ); 

如果您将上述schema 用于user,则subdocument 中不应有_id 字段。

您应该知道要插入subdocument,您需要知道parent。如果您在插入 subdocument 时未提供 parent,则为每个插入创建一个新的 parent。在这种情况下,父文档包含 _idusers 子文档。如果我有确切的问题,我会通过以下方式解决它:

架构设计保持不变,如下所示(为了避免混淆,我对它们进行了不同的命名):

var userSchema = new Schema(username: String, password: String, _id : false );

var userListSchema = new Schema(
  users: [userSchema]
);

现在我将父模型声明如下:

var UserList = mongoose.model('UserList', userListSchema);
//see below what list gets assigned. 
var list;

现在假设我有一个路由处理程序,我想在注册时继续添加用户,如下所示:

app.get("/newuser/:username/:password", function(req, res) 
  //create user model 
  var User = mongoose.model('User', userSchema);
  //load user module, for testing i use params, you can change this to req.body
  var user = new User(username: req.params.username, password: req.params.password);

  //I would like to find the first document in userlists collection 
  UserList.findOne(, function(err, result) 
    if(err) console.log(err);
    //below if condition is true, if there is one document with users subdoc
    if(result) 
      console.log('Found existing document with users subdocument. Adding user to array.')

       //assign the parent where the subdoc should be inserted to list
       list = result; 

       //there already is a document with subdocument users, so append to it 
       list.users.push(user);

      //save the changed list. 
      list.save(function(err) 
        if (err) console.log(err);
        console.log('User saved.');
      );
     else 
      console.log('No document found. Creating one and adding  this user to users subdocument.');
      // initialize list model with first ever user 
      list = new UserList( users: [user] );

      //save the new changed list
      list.save(function(err) 
        if (err) console.log(err);
        console.log('User saved.');
      );
    
  )
);

完成。现在,当我第一次运行应用程序并访问以下 URL 时

http://127.0.0.1:8080/newuser/user1/pass1

userslist 集合如下所示:

> db.userlists.find().pretty();

    "_id" : ObjectId("56c349d6479f5b9b1eaea1c8"),
    "users" : [
        
            "password" : "pass1",
            "username" : "user1"
        
    ],
    "__v" : 0

我想使用不同的参数访问链接,如下所示:

http://127.0.0.1:8080/newuser/user2/pass2

集合的输出如下所示:


    "_id" : ObjectId("56c349d6479f5b9b1eaea1c8"),
    "users" : [
        
            "password" : "pass1",
            "username" : "user1"
        ,
        
            "password" : "pass2",
            "username" : "user2"
        
    ],
    "__v" : 1

现在我终止应用程序,然后重新运行应用程序并访问以下网址:

http://127.0.0.1:8080/newuser/user7/pass7

集合的输出如下所示:


    "_id" : ObjectId("56c349d6479f5b9b1eaea1c8"),
    "users" : [
        
            "password" : "pass1",
            "username" : "user1"
        ,
        
            "password" : "pass2",
            "username" : "user2"
        ,
        
            "password" : "pass7",
            "username" : "user7"
        
    ],
    "__v" : 2

给你。我很难过看到 userlists 集合总是有一个 document 并且它的数组会不断扩大,以这种方式解决你的问题可能不是一个好习惯。如果我是你,我会将每个用户存储为单个 record,然后执行 group by 或任何其他 aggregation 操作。

【讨论】:

以上是关于使用护照注册后将代表用户的对象添加到数组中的主要内容,如果未能解决你的问题,请参考以下文章

c#编程,添加引用时,COM和.NET有啥区别?代表啥意思

在护照登录中 req.logIn() 后获取空数组

Mongoose“创建”方法 - 没有回调吗? (使用护照和角度)

如何修复阻止注册用户登录的护照本地身份验证错误

使用 graphql-compose-mongoose 将对象添加到 mongodb 模型中的对象数组

如何从护照中的用户对象中删除密码字段