[英]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.