【问题标题】:Connect mongoose-array-values to a unique ID将 mongoose-array-values 连接到唯一 ID
【发布时间】:2017-07-18 00:42:10
【问题描述】:

这似乎是一个模糊的问题,但我会尽力解释。作为旁注,我对使用猫鼬很陌生:)

我有一个猫鼬模式为每个用户存储不同的值,就像这样......

let userSchema = mongoose.Schema({
    user: { type: String, required: true, unique: true },
    pass: { type: String, required: true },
    files: [{ type: String, required: false }],
});

“文件”键包含一个值数组,例如:

userSchema.files = [value1, value2, value3]

而且我希望每个值都连接到某种ID,这样当我调用指定的ID时,我就得到了指定的值。仅出于演示目的,它可能看起来像这样:

userSchema.files = [{value:value1, id: id1}, 
                    {value:value2, id: id2}, 
                    {value:value3, id: id3}]

然后我想找到指定的id,并在请求中返回它的“value”-key:

router.route("/home/:id")
    .get(restrict, function(req, res) {

        User.findOne({ user: req.session.Auth.username }, function(error, data) {
            data.files.forEach(function(file) {
               if (file.id === req.params.id) {
               response.render("../home", file.value)
               }
            }
        });
    });

我该怎么做?尝试将对象推送到文件,但这并没有按预期工作。阅读有关 ObjectId 的内容,但不太了解。 有什么建议吗?

【问题讨论】:

  • 你得到的data 正确吗?您是否面临插入或检索的问题?
  • @RaR 我在插入时遇到问题!
  • 你试过什么?插入代码在哪里?
  • @RaR。我使用 .findOne 找到了指定的用户,并且在回调函数中我刚刚输入了 user.files = {value: req.body.value, id: 123}。然后数据库将每个值分别保存在一个数组中,例如:["req.body.value", "123"]

标签: javascript node.js mongodb express mongoose


【解决方案1】:

我认为您只需为 File 创建一个单独的模型并使用“ref”关键字将其连接到您的用户模型:

let fileSchema = mongoose.Schema({
    _id     : Number,
    value    : String
});

let userSchema = mongoose.Schema({
    user: { type: String, required: true, unique: true },
    pass: { type: String, required: true },
    files: [{ type: Number, ref: 'File' }]
});

let User  = mongoose.model('User', userSchema);
let File  = mongoose.model('File', fileSchema);

let f1 = new File({ _id: 1, value: 'File 1'});
let f2 = new File({ _id: 2, value: 'File 2'});
let f3 = new File({ _id: 3, value: 'File 3'});

let user1 = new User({user:'chuck', pass:'norris'});
user1.files.push(f1);
user1.files.push(f2);
user1.files.push(f3);

user1.save(function(err){  });

现在要取回数据:

User
.findOne({ user: 'chuck' })
.populate('files') // only works if we pushed refs to children
.exec(function (err, user) {
  if (err) return handleError(err);
  console.log(user);
  //you can now loop through user.files and compare _id
  user.files.forEach(function(file) {
      if (file._id === req.params.id) {
         response.render("../home", file.value)
      }
   }
});

您可以在此处阅读有关猫鼬参考种群的信息:http://mongoosejs.com/docs/populate.html

【讨论】:

  • 谢谢你,在你回答之前我就这样做了,现在它完美地工作了。更好的设计:)
猜你喜欢
  • 1970-01-01
  • 2022-11-22
  • 1970-01-01
  • 2022-11-19
  • 1970-01-01
  • 2018-08-01
  • 2022-08-08
  • 1970-01-01
  • 2016-10-03
相关资源
最近更新 更多