在我的聊天应用程序中,每个用户都有一个未读消息的字典,如下所示:
未读字典
{
_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?我正在寻找能做前者的事情。
答案 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');
}