Node.js猫鼬.update与ArrayFilters

Jus*_*eed 2 javascript mongoose mongodb node.js express

就目前而言,我可以使用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')}]})
Run Code Online (Sandbox Code Playgroud)

结果:将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 
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

MongoDB:3.6.1猫鼬:5.0.0-rc2

Bir*_*ick 6

我使用 mongoose v5.0.14 进行了尝试,它在 MongoDB 3.6.3 版本上运行良好!

这是我的 package.json ...

"dependencies": {
  "mongoose": "^5.0.14",
}
Run Code Online (Sandbox Code Playgroud)

这是我使用 arrayFilters 的更新函数...

...

// my id variable
let id = "5ad1f4dec48d7e156034c156";

// mongo condition
let mc = {_id: id};

// mongo dataset
let ds = {'contacts.$[i].main': false};

// mongo options
let op = {                             
  arrayFilters: [
    {
      $and: [
        {'i._id': {$ne: id}},
        {'i.type': 'mobile'},
      ],
    }],
};

<<Model>>.findOneAndUpdate(mc, ds, op, (err, doc) => {
  callback(err, doc);
});

...
Run Code Online (Sandbox Code Playgroud)


act*_*ser 5

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

例:

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>) },
      ],
    },
  ],
})
Run Code Online (Sandbox Code Playgroud)