gpt4 book ai didi

javascript - MongoDB findAndModify() 添加查询到更新子句

转载 作者:可可西里 更新时间:2023-11-01 09:46:21 24 4
gpt4 key购买 nike

我正在 Node 中创建一个包含一些 CRUD 组件的应用程序。在我的一个数据对象上,我有一个 save() 方法,如果对象具有在集合中找到的 id,则更新记录,如果没有,则更新插入新文档。此外,如果执行更新插入,我想取回 Mongo 生成的文档的 _id。

似乎findAndModify会这样做,事实上,它确实从数据库返回一个 _id 值。在我的查询子句中,我按 _id 进行过滤。如果我的数据对象没有 id,Mongo 会正确执行更新插入,但是,无论它返回什么 _id 值,除了我在 update 子句中设置的键之外,它还会根据我在 query 子句中使用的值在文档上设置 _id。为清楚起见,一些代码:

User.prototype.save = function(callback) {
var that = this;

var args = {
'query' : { _id: this.getId() }, //getId() returns empty string if not set
'update' : { $set : {
firstName : this.firstName,
lastName : this.lastName,
email : this.email
//_id : this.getId()
// which is blank, is magically getting added due to query clause
}},
'new' : true,
'upsert' : true,
'fields' : {'_id' : true}
};

this.db.collection(dbName).findAndModify(args, function(err, doc){
if(!that.getId()) {
that.setId(doc._id);
}

if (typeof(callback) === "function"){
callback.call(that);
}
});
}

我只是在寻找更新的语义,它也恰好在更新插入时返回 Mongo 生成的 _id。我不希望附加 query 子句的值,就好像它们在 update 映射中一样。有什么方法可以达到我的目的吗?

最佳答案

您可以生成 _id 客户端,使用 new new require('mongodb').ObjectID()然后你可以做一个常规的更新插入(不需要做查找和修改),因为你已经有了 _id。

但是,如果您正在使用 findAndModify,请记住 Node 驱动程序按位置接受此函数的参数,而不是作为对象(就像在常规的 mongo shell 中一样)。使用 Node 驱动程序执行查找和修改的正确格式如下所示:

collection.findAndModify(条件,排序,更新[,选项,回调])

(选项和回调是可选参数)。完整文档在这里: https://github.com/mongodb/node-mongodb-native/blob/master/docs/insert.md

关于javascript - MongoDB findAndModify() 添加查询到更新子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10222509/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com