【问题标题】:index dup key on field that is NOT an index不是索引的字段上的索引复制键
【发布时间】:2019-05-12 20:18:29
【问题描述】:

我有这个用户架构:

var mongoose = require("mongoose"), 
    passportLocalMongoose = require("passport-local-mongoose");

let userSchema = new mongoose.Schema({
    username:
    {type: String,
    unique: true
    },
    password: String,
    privileges:
    [{
            region: Number,
            read: Number,
            write: Number,
            edit: Number
    }]
});

userSchema.plugin(passportLocalMongoose);

module.exports = mongoose.model("User", userSchema);

用这个html

document.addEventListener("DOMContentLoaded", function()
{
    window.x = document.querySelector(".set-nou-privilegii");
    x.addEventListener("click", adaugarePrivilegii); 
});

var y = 1;
var x = document.querySelector(".set-nou-privilegii");
function adaugarePrivilegii(e)
{
    e.preventDefault();
    x.insertAdjacentHTML("beforebegin",
    `<br/>
    <label for="region">Regiune:</label>
    <input type="Number" name="privileges[${y}][region]" id="region-inregistrare" placeholder="cod regiune"><br/>
    <label for="citire">Citire (0 - nu, 1 - da):</label>
    <input type="Number" name="privileges[${y}][read]" id="citire-inregistrare" placeholder="1-acces, 0-nu"><br/>
    <label for="scriere">Scriere (0 - nu, 1 - da):</label>
    <input type="Number" name="privileges[${y}][write]" id="scriere-inregistrare" placeholder="1-acces, 0-nu"><br/>
    <label for="editare">Editare (0 - nu, 1 - da):</label>
    <input type="Number" name="privileges[${y}][edit]" id="editare-inregistrare" placeholder="1-acces, 0-nu"><br/>`)
    y++;
}
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <script src="/javascript/js-inregistrare.js"></script>
    <link rel="stylesheet" href="reset.css">
    <link href="https://fonts.googleapis.com/css?family=Roboto" rel="stylesheet">
    <link rel="stylesheet" href="css.css">
    <title>Inregistrari</title>
  </head>
<body>
<div class="center">
    <img src="/img/logo.jpg" class="logo-inregistrare">
    <form action="/register" method="POST" class="form-inregistrare">
        <label for="username">Nume utilizator:</label>
        <input type="text" name="username" id="username-inregistrare" placeholder="nume utilizator"><br/>
        <label for="password">Parola:</label>
        <input type="password" name="password" id="password-inregistrare" placeholder="parola"><br/>
        <label for="region">Regiune:</label>
        <input type="Number" name="privileges[0][region]" id="region-inregistrare" placeholder="cod regiune"><br/>
        <label for="citire">Citire (0 - nu, 1 - da):</label>
        <input type="Number" name="privileges[0][read]" id="citire-inregistrare" placeholder="1-acces, 0-nu"><br/>
        <label for="scriere">Scriere (0 - nu, 1 - da):</label>
        <input type="Number" name="privileges[0][write]" id="scriere-inregistrare" placeholder="1-acces, 0-nu"><br/>
        <label for="editare">Editare (0 - nu, 1 - da):</label>
        <input type="Number" name="privileges[0][edit]" id="editare-inregistrare" placeholder="1-acces, 0-nu"><br/>
        <button class="set-nou-privilegii">Adaugare set nou privilegii</button><br/>
        <button class="trimite-inregistrare">Trimite</button><br/>
    </form>
</div>
</body>
</html>

还有这些路线

var express = require("express"),
    router  = express.Router(),
    User = require("../models/user.js"),
    passport = require("passport"),
    middleware = require("./middleware.js");

router.get('/register', middleware.isLoggedIn, function(req, res)
{
    res.render("inregistrare");
});

router.post('/register', middleware.isLoggedIn, function(req, res)
{
    User.register(new User({
        username: req.body.username,
        privileges: req.body.privileges
    }), req.body.password, function(err)
    {
        if(err)
        {
            console.log(err);
            res.redirect("/register");
        }
        else
        {
            passport.authenticate("local")(req, res, function() {
                res.redirect("/");
             });
        }
    })
});

router.get('/login', middleware.isLoggedOut, function(req, res)
{
    var title = "title"
    res.render("login", {title: title});
});

router.post("/login", middleware.isLoggedOut, passport.authenticate("local", {
    successRedirect: "/register",
    failureRedirect: "/login"
}), function(req, res) {
});

module.exports = router;

当我注册一个新用户时(如果当时数据库是空的)一切都很好。如果我尝试使用相同的 region-id 注册另一个用户,我会得到:

我尝试使用不同的区域 ID 和相同的字段进行写入、编辑和读取,并且成功了。只有当我有相同的区域 ID 时我才会得到这个,但我不明白为什么。 Region 没有被声明为索引或 unique: true 那为什么会发生呢?

我该如何解决这个问题?

【问题讨论】:

    标签: node.js mongodb express mongoose


    【解决方案1】:

    看起来region 曾经被声明为unique: true,它在该字段上创建了一个唯一索引。 Mongoose 不会根据架构修改或删除现有索引,因此您需要手动删除该过时的索引。

    在外壳中:

    db.users.dropIndex('privileges.region_1')
    

    【讨论】:

    • 是的。它被声明为 unique:true 因为我想让它对每个用户都是唯一的。 (我的意思是,如果privileges.region_0 = 1,对于同一用户,任何其他privilege.region_i 都不会是1 - 但其他用户可以有region = 1)。我不知道你是否明白我想说的,我尽力解释了。在那之后,我看到了独特之处:真实是另一回事,不是我想要的,我修改了它。
    猜你喜欢
    • 2011-01-11
    • 2019-08-14
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多