【问题标题】:How to Upsert an Object in MongoDB correctly?如何正确在 MongoDB 中插入对象?
【发布时间】:2020-04-11 11:14:01
【问题描述】:

我正在尝试在我的 MongoDB 中更新条目。所有对象的结构是:

{
ids: { id_1: '7264432' },
ranktime:
   [ { pos: '4',
       date: '000' } ],
name: 'Strength',
version: 'Hi',
artist: 'Example'
}

现在我想用如下对象 Upsert ids 对象:

response[i] = {
ids: { id_2: '55551123' },
ranktime:
   [ { pos: '4',
       date: '000' } ],
name: 'Strength',
version: 'Hi',
artist: 'Example'
}

导致:

{
ids: { id_1: '7264432', id_2: '55551123' },
ranktime:
   [ { pos: '4',
       date: '000' } ],
name: 'Strength',
version: 'Hi',
artist: 'Example'
}

我正在选择唯一的文档:

collection.updateMany(
{ $and: [{name: response[i].name}, {version: response[i].version}, {artist: response[i].artist}}]} ,
{
  $set: {ids:  response[i].ids}
},
{upsert: true},
})

但是,如果 ids 字段被新值覆盖,而不是仅仅添加新值,那么所有这些都会发生。 有没有使用 MongoDB 方法的解决方案来实现这一点? 谢谢!

【问题讨论】:

    标签: node.js database mongodb javascript-objects


    【解决方案1】:

    我想出了该怎么做。出于某种原因,我不得不将 $set 作为管道传递。所以这不起作用

    collection.updateMany(
    { $and: [{name: response[i].name}, {version: response[i].version}, {artist: response[i].artist}}]}
    {
      $set: {ids:  response[i].ids}
    },
    {upsert: true},
    })
    

    但这是工作

    collection.updateMany(
    { $and: [{name: response[i].name}, {version: response[i].version}, {artist: response[i].artist}}]}
    [{
      $set: {ids:  response[i].ids}
    }]
    })
    

    如果我这样做,这也不是一个更新。谁能解释一下?

    【讨论】:

    • 首先词汇更正“upsert”意味着创建一个新文档并通过更新语句插入到集合中。修改现有文档是“更新”,在更新时向数组添加附加值通常称为“推送”。
    • 第一个不起作用,因为您在第二个参数(即更新)中包含了{upsert: true}。这是一个选项,应该放在updateMany 的第三个参数中。这两个语句都将用新值完全替换 ids 字段,这是您的意图吗?
    • 我的意图是只添加新的键:值对并保持现有的不变。我的“解决方案”的工作版本通过在我的 set 语句中添加 [] 括号来做到这一点。如果我不添加 [] 括号,我的 ids 字段将被替换而不会只添加新的
    • 奇怪,当我使用[{$set...}] 进行测试时,它会替换字段。
    • 是的,真的很奇怪。我刚刚又试了一次。如果我设置 [] 括号,则只是添加新对象,如果我不设置它们,则替换该字段。是版本问题吗?我在 4.2.5 上运行
    猜你喜欢
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 2020-07-16
    相关资源
    最近更新 更多