gpt4 book ai didi

javascript - 带有 ArrayFilters 的 Node.js Mongoose .update

转载 作者:可可西里 更新时间:2023-11-01 09:57:12 27 4
gpt4 key购买 nike

就目前而言,我能够使用 Mongo shell 实现此功能,但在使用 Mongoose 的 Node.js 内部嵌套数组时遇到问题。

成功的Mongo shell命令:

db.test.update({}, {$set: {"this.$[i].that.$[x].amnt": 10000}}, {arrayFilters: [{"i._id": ObjectId('5a568059bc44142a9ca33d09')}, {"x.userId": ObjectId('5a466acb864c752f8c9890c6')}]})

结果:将 amnt 字段更改为 10000。在对从数据库中提取的给定字符串调用 ObjectId('') 之前,没有返回任何匹配项。

Node.js 代码:

var conditions = {}
var update = {$set: {"this.$[i].that.$[x].amnt": 1000}
var options = {arrayFilters: [{"i._id": weekId}, {"x.userId": r.userId}]}

myModel.update(conditions, update, options, function(err, rowsAffected){
// handler
}

结果:{ ok: 0, n: 0, nModified: 0 }

_id 和 userId 是模型架构中的 schema.Types.ObjectId。

我尝试使用 3.6.1 的最新文件更新 node_modules/mongodb。 Mongoose 似乎使用 3.0.1。打印到控制台 typeof(weekId) 或 typeof(r.userId) 显示字符串类型。我相信这会根据模式进行更改,但无论哪种方式,我都尝试在这些项目上调用 mongoose.Types.ObjectId(weekId) 以查看是否解决了它,但没有成功。

MongoDB:3.6.1 Mongoose :5.0.0-rc2

最佳答案

我不知道 Mongoose 5.0.0 是否应该开箱即用地支持 Arrayfilters,但您可以通过使用直接在 MongoDB 上执行的 Mongoose 命令方法来实现它,因此可以利用所有可用的功能,包括 MongoDB 上的 ArrayFilters 3.6.1

示例:

mongoose.connection.db.command({
update: <YourModel>.collection.name,
updates: [
{
q: { 'field1.field2._id': mongoose.Types.ObjectId(<someObjectid>) },
u: {
$set: { 'field1.$.field2.$[field].fieldToUpdate': "updated!" },
},
arrayFilters: [
{ 'field._id': mongoose.Types.ObjectId(<someObjectid>) },
],
},
],
})

关于javascript - 带有 ArrayFilters 的 Node.js Mongoose .update,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48215167/

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