【问题标题】:Mongoose specifying an _id on upsert (Query)Mongoose 在 upsert 上指定 _id(查询)
【发布时间】:2014-10-08 07:13:05
【问题描述】:

在我的聊天应用程序中,每个用户都有一个未读消息字典,如下所示:

未读字典

{
    _id: // reference to their user_id,
    events: [] // array of ObjectIds
}

我想做一个 mongoose findByIdAndUpdate 查询 where ) 按 ID 搜索并将新的 ObjectId 推入事件数组中。

如果文档不存在,我希望它更新文档,为其分配用于更新查询的 _id 并使用在更新查询中被 $push 编辑的元素初始化数组。

编辑:

这是我想要查询的示例:

Model.findByIdAndUpdate(user_id, {$push: {events: event_id}}, {upsert: true}, function (err, updatedDoc) {});

如果文档不存在并且它决定更新插入,它会使用我用来搜索的 user_id 来分配更新插入的文档上的 _id 吗?或者 mongo 会分配它自己的 _id 吗?我正在寻找与前者相同的东西。

【问题讨论】:

  • 听起来像一个标准的 upsert,你试过的时候没有用吗?
  • @JohnnyHK 我认为如果 mongoose 找不到文档,它会分配它自己的 _id,然后插入它。这不是真的吗?
  • 最好在问题中添加一些代码,以更好地说明您想要做什么。
  • @JohnnyHK 没问题,谢谢
  • 我希望这会满足您的需求。试试看吧。

标签: node.js mongoose insert-update upsert


【解决方案1】:

这个问题太长了,但我希望我的回答对某人有所帮助。我们可以使用 $setOnInsert 指定仅在插入时使用的字段:

const idUsedOnInsert = new mongoose.Types.ObjectID();

const document = await Model.findByIdAndUpdate(
      user_id,
      { $push: { events: event_id }, $setOnInsert: { _id: idUsedOnInsert } },
      { upsert: true }
    );

if(document){
    console.log('Update');
} else {
    console.log('Insert');
}

【讨论】:

  • 我认为在运行findByIdAndUpdate之前将生成的_id添加到对象中会更容易。
【解决方案2】:

Mongoose 在更新插入时将使用您传递的_id 作为对象_id

你可以在你的控制台上试试。

创建一个ObjectId:const id = ObjectId(), 然后用<Model>.findByIdAndUpdate(id, { name: 'Albert' }, { upsert: true })查询。

另外,如果您想在对象被更新插入时接收它,您需要在查询选项中传递new: true,否则您将收到null 用于更新插入*

*这是因为默认情况下,mongoose/MongoDB 返回 find 查询的结果而不是 update 的结果,如果您已经查询现有对象的更新,您会收到旧对象以防万一你没有通过new: true 选项。

https://docs.mongodb.com/manual/reference/method/db.collection.update/#upsert-option

【讨论】:

    猜你喜欢
    • 2012-10-24
    • 2012-01-19
    • 2017-08-15
    • 2021-01-20
    • 2014-12-30
    • 2022-01-20
    • 2013-06-19
    • 2016-09-17
    相关资源
    最近更新 更多