Mongoose在upsert上指定_id(查询)

时间:2014-08-14 15:02:09

标签: node.js mongoose insert-update upsert

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

未读字典

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

我想做一个mongoose findByIdAndUpdate查询,其中)按ID搜索并将$推送到事件数组中。

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

编辑:

以下是我想要提出的查询示例:

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

如果文档不存在并且它决定upsert,它是否会使用我用来搜索的user_id在upserted文档上分配_id?或者将mongo分配它自己的_id?我正在寻找能做前者的事情。

2 个答案:

答案 0 :(得分:0)

猫鼬在上插广告时将使用您传递的_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

答案 1 :(得分:0)

这个问题太长了,但是我希望我的回答能对某人有所帮助。我们可以使用 $ 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');
}