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
我使用 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)
我不知道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)
| 归档时间: |
|
| 查看次数: |
1873 次 |
| 最近记录: |