猫鼬 bulkwrite 更新 - 如何将新对象推入数组?
Mongoose bulkwrite update - how to push new obj into an array?
我的模型看起来像:
fname: String,
lname: String,
rating: [{
rating: {
type: Number,
enum: RATING,
default: 5
},
date: {
type: Date,
default: Date.now
}
}]
我需要通过在 rating array
中添加具有新评级和日期的新对象来对此模型执行更新。我想在 Model.collection
上使用 bulkwrite
方法来执行此操作,因为我需要启用批量更新,这样我就不必一个一个地更新它们。
我创建了一个 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
降低了抽象级别,mongoose 没有自动-cast itemId
.
如果有人可以确认为什么我必须手动转换字符串,请随时更新此答案。
我的模型看起来像:
fname: String,
lname: String,
rating: [{
rating: {
type: Number,
enum: RATING,
default: 5
},
date: {
type: Date,
default: Date.now
}
}]
我需要通过在 rating array
中添加具有新评级和日期的新对象来对此模型执行更新。我想在 Model.collection
上使用 bulkwrite
方法来执行此操作,因为我需要启用批量更新,这样我就不必一个一个地更新它们。
我创建了一个 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
降低了抽象级别,mongoose 没有自动-cast itemId
.
如果有人可以确认为什么我必须手动转换字符串,请随时更新此答案。