node.js - Mongoose bulkwrite 更新 - 如何将新的 obj 推送到数组中?
问题描述
我有一个看起来像的模型:
fname: String,
lname: String,
rating: [{
rating: {
type: Number,
enum: RATING,
default: 5
},
date: {
type: Date,
default: Date.now
}
}]
rating array
我需要通过在 中添加新对象以及新的评级和日期来对此模型执行更新。我想使用bulkwrite
on 的方法Model.collection
来做到这一点,因为我需要启用批量更新,这样我就不必一一更新了。
我创建了一个array bulkUpdateOperations = []
并在循环中执行了以下操作:
bulkUpdateOperations.push({
'updateOne': {
'filter': {'_id': item.id},
'update': {$push: {rating: {'rating': item.rating, 'date': Date.now}}}
}
});
Person.collection.bulkWrite(bulkUpdateOperations, {orderd: true, w: 1}, callbackfunc);
但是什么都没有更新。我得到以下回复:
...
...
...
insertedCount: 0,
matchedCount: 0,
modifiedCount: 0,
deletedCount: 0,
upsertedCount: 0,
upsertedIds: {},
insertedIds: {},
n: 0 }
如果有人帮助我解决这个问题,我将非常感激。
编辑
这是我作为 POST 正文发送以更新记录的数组:
[{
"id": "5b7d4d348151700014d25bdd",
"rating": 1
},{
"id": "5b771d10c1e03e1e78b854c2",
"rating": 1
},{
"id": "5b771d7ac1e03e1e78b854c8",
"rating": 1
},{
"id": "5b7bd75a33f88c1af8585be0",
"rating": 1
},{
"id": "5b814a2322236100142ac9f6",
"rating": 1
}]
这是数据库中的示例集合
{
"_id": {
"$oid": "5b7d4d348151700014d25bdd"
},
"status": "ACTIVE",
"fname": "mr. client",
"lname": "good client",
"contact_info": {
"_id": {
"$oid": "5b7d4d348151700014d25bde"
},
"mobile_no": "0011223344",
"phone_no": "11223344"
},
"handlers": [
{
"_id": {
"$oid": "5b7d4d348151700014d25bdf"
},
"date": {
"$date": "2018-08-22T11:47:00.544Z"
},
"id": {
"$oid": "5b7d45fbfb6fc007d8bdc1f4"
}
}
],
"onboarding_date": {
"$date": "2018-08-22T11:47:00.551Z"
},
"rating": [
{
"rating": 5,
"_id": {
"$oid": "5b814a8e22236100142ac9fc"
},
"date": {
"$date": "2018-08-25T12:22:59.584Z"
}
},
{
"rating": 3,
"_id": {
"$oid": "5b814a8e22236100142ac9fb"
},
"date": {
"$date": "2018-08-25T12:24:46.368Z"
}
}
],
"__v": 0
}
编辑
添加upsert: true
为过滤器updateOne
创建一个新文档,仅rating
作为其值。
解决方案
代替
'filter': {'_id': item.id},
经过
'filter': {'_id': mongoose.Types.ObjectId(item.id)},
解决方案
改变
bulkUpdateOperations.push({
'updateOne': {
'filter': {'_id': item.id},
'update': {$push: {rating: {'rating': item.rating, 'date': Date.now}}}
}
});
至
bulkUpdateOperations.push({
'updateOne': {
'filter': {'_id': mongoose.Types.ObjectId(item.id)},
'update': {$push: {rating: {'rating': item.rating, 'date': Date.now}}}
}
});
工作。请注意我必须手动执行的类型转换
'filter': {'_id': mongoose.Types.ObjectId(item.id)},
我以为 mongoose 会string
自动将.ObjectId
Person.collection
itemId
如果有人可以确认我为什么必须手动转换字符串,请随时更新此答案。
推荐阅读
- php - 包括刀片(导航刀片)未按预期工作,导航栏覆盖产量内容
- matlab - 使用 lsqcurvefit 将微分方程系统故障拟合到数据
- python - Celery Task 需要每 N 次运行一次但需要先完成
- python - Dash 应用程序在本地运行,因为它在服务器中引发错误
- c++ - Arduino:如何向任何文本框或记事本显示 Serial.print 值
- java - log4j2 Logger 仅适用于初级类 - Spring Boot
- file - 如何使用 cordova 插件在 android 和 IOS 设备中使用 IONIC 版本 1 浏览移动文件系统中的 PDF 文件
- amazon-web-services - AWS Glue 如何访问 IP 白名单资源
- python - 如何修复 AttributeError:当我尝试替换 csv 读取中的某些文本时,“列表”对象没有属性“替换”
- firebase - 批量用户订阅 Firebase 中的主题时出现权限被拒绝错误