ここでスキーマ設計にいくつかの概念が欠けているようです。このような応答を得る唯一の方法は、データからスキーマへの不一致によるものです。どんな場合でも、スキーマと一致しないことを知っているアイテムを意図的に使用する意図がないか、スキーマをまったく定義したくない場合は、基本的にはstrict: false
を適用する必要はありません。通常、さまざまな特性を持つフィード。
"空の"メッセージの場合、データが一致しないか、使用しているモデルに実際に割り当てられているスキーマが、あなたの考えではありません。
これを明確にする唯一の実際の方法は、デモンストレーションです。ここでは適切に行われ、あなたがしようとしている何をする方法は次のとおりです。
const mongoose = require('mongoose'),
Schema = mongoose.Schema;
mongoose.Promise = global.Promise;
mongoose.set('debug',true);
const uri = 'mongodb://localhost/test',
options = { useMongoClient: true };
const hourlySchema = new Schema({
id: Number
},{ _id: false });
const dataSchema = new Schema({
_id: Number,
data_hourly: [hourlySchema]
},{ _id: false });
const Data = mongoose.model('Data', dataSchema);
function log(data) {
console.log(JSON.stringify(data,undefined,2))
}
(async function() {
try {
const conn = await mongoose.connect(uri,options);
await Promise.all(
Object.keys(conn.models).map(m => conn.models[m].remove())
);
let data = [
{ _id: 12345, data_hourly: 12345 },
{ _id: 12345, data_hourly: 98765 },
{ _id: 12345, data_hourly: 98765 }
];
for (let item of data) {
let doc = await Data.findByIdAndUpdate(item._id,
{ $addToSet: { data_hourly: { id: item.data_hourly } } },
{ new: true, upsert: true }
);
log(doc);
}
} catch(e) {
console.error(e);
} finally {
mongoose.disconnect();
}
})();
すべてが完璧に動作することを示している:中_id: false
に出席することが特に必要としている_id
またはid
という名前
Mongoose: datas.remove({}, {})
Mongoose: datas.findAndModify({ _id: 12345 }, [], { '$setOnInsert': { __v: 0 }, '$addToSet': { data_hourly: { id: 12345 } } }, { new: true, upsert: true, remove: false, fields: {} })
{
"_id": 12345,
"__v": 0,
"data_hourly": [
{
"id": 12345
}
]
}
Mongoose: datas.findAndModify({ _id: 12345 }, [], { '$setOnInsert': { __v: 0 }, '$addToSet': { data_hourly: { id: 98765 } } }, { new: true, upsert: true, remove: false, fields: {} })
{
"_id": 12345,
"__v": 0,
"data_hourly": [
{
"id": 12345
},
{
"id": 98765
}
]
}
Mongoose: datas.findAndModify({ _id: 12345 }, [], { '$setOnInsert': { __v: 0 }, '$addToSet': { data_hourly: { id: 98765 } } }, { new: true, upsert: true, remove: false, fields: {} })
{
"_id": 12345,
"__v": 0,
"data_hourly": [
{
"id": 12345
},
{
"id": 98765
}
]
}
フィールドをスキーマオプションMongoDBはデフォルトでObjectId
を使用し、mongooseスキーマはこれをデフォルトで適用しようとします。 "strict"
の代わりにオフにする必要があるのは、スキーマルールがまったく考慮されていないことを「ブルートフォース」に適用することです。スキーマが定義されているという目的を破るものです。
実際には 'timestamp'には何がありますか?おそらく、配列を追加しようとしているのだろうか、それとも単なる値でなければならないときは、少なくともある種のオブジェクトであるかのように思えます。 –
タイムスタンプは生成されたintです。 12345 – Chris
何によって生成されますか?コードを表示します。削除される理由は、スキーマの必須タイプと一致しないためです。それが私の言うことです。それを自分で処理できない場合は、入力がどこから来ているのかを確認する必要があります。 –