簡體   English   中英

Node.js使用ArrayFilters進行Mongoose .update

[英]Node.js Mongoose .update with ArrayFilters

就目前而言,我能夠使用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。 似乎貓鼬使用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,但你可以使用Mongoose的命令方法實現它,它直接在MongoDB上執行,因此可以利用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>) },
      ],
    },
  ],
})

我嘗試使用mongoose v5.0.14,它可以與MongoDB 3.6.3版本一起使用!

這是我的package.json ...

"dependencies": {
  "mongoose": "^5.0.14",
}

這是我使用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);
});

...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM