【问题标题】:Dynamically add new field with same key name in MongoDB在 MongoDB 中动态添加具有相同键名的新字段
【发布时间】:2017-05-14 06:00:06
【问题描述】:

我正在尝试以动态方式在我的一个集合上创建一个列表,这是一个示例。

var user = mongoose.Schema({
"NAME": String,
"LAST": String,
"EMAIL": String,
"TasksUploaded": {}

})

我想在猫鼬中做的是用他已经上传的任务更新用户,最好的方法是什么?最后我想要的是:

{
    "Name" : "John",
    "Last" : "Doh",
    "Email" : "john@doh.com",
    "TasksUploaded" : {
        "Task" : "Task A"
        "Task" : "Task B"
        "Task" : "Task H"
        "Task" : "Task F"
        "Task" : "Task C"
    }
}

正如您所见,任务并不总是连续的,用户可以根据需要上传它们。

我对所有这些新的 NoSQL 和 MongoDB 东西都很陌生,所以如果您能说出最佳实践是什么,我将不胜感激。

这是我目前更新它的方式,但发生的情况是“级别”被替换了,你需要在文档中添加一个新行。

User.findOneAndUpdate({ _id: id}, { $set: { 'TasksUploaded.Task': req.body.task} }, { returnNewDocument: true, new: true }, function (err, result) {
      if (err) {
        console.log("Error saving task: " + err);
        return;
      }
      console.log(result);
    })
  }

【问题讨论】:

  • 单反引号用于内联代码。不要将它们用于多行代码块。使用 4 个空格的缩进或三个反引号(AKA 代码围栏)

标签: node.js mongodb mongoose nosql


【解决方案1】:

感谢@Sam,

我修改了我的结构,以数组的形式添加上传任务

TasksUploaded ["TaskA","TaskB","TaskC"]

谢谢

【讨论】:

    【解决方案2】:

    不,这是不可能的。一个对象中不能有多个同名的键。试想一下,您将如何解决它们?

    看来你需要重组数据并使用数组。

    【讨论】:

    • 您如何建议这样做?我也有这样做{ "Name" : "John", "Last" : "Doh", "Email" : "john@doh.com", "TasksUploaded" : { "Task A" : true "Task B" : true "Task H" : true "Task F" : true "Task C" : true } }
    • @mandaman2k 可以作为TasksUploaded ["TaskA","TaskB","TaskC"]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-05
    • 1970-01-01
    • 2018-09-28
    • 2015-08-19
    • 2014-10-19
    相关资源
    最近更新 更多