[英]not okForStorage Error in MongoDB,Node.Js(mongoose)
我正在將Node.js和MongoDB與貓鼬一起使用。 當我在下面執行代碼時,第一個更新代碼正常運行。 但是我在插入“ bar”的第二次更新查詢中收到錯誤“ not okForStorage”。
它用於循環並一遍又一遍地插入數據,但是在第一次插入時會發生錯誤,因此我認為這不是有效載荷問題,也不是其他任何硬件問題。
analyze('SomeText',function(err,data){
if(err) throw err;
for(var i=0; i < data.foo.length;i++){
if(!data.foo[i]){
continue;
}
var condtion = { foo: data.foo[i]};
var update = {
$inc :{totalcounter : 1},
counter : {
date : dateformat(new Date(), "yyyymmdd"),
$inc :{counter : 1}
}
};
db.foodb.update(condtion,update,{upsert : true},function(err, numberAffected, raw){
if(err) throw err;
//Data added successfully
});
for(var g=0;g < data.bar[i].length;g++){
update = {
bar : {
foo : data.bar[i][g],
$inc : { totalcounter : 1},
counter : {
date : dateformat(new Date(), "yyyymmdd"),
$inc :{counter : 1}
}
}
};
db.foodb.update(condtion,update,{upsert : true},function(err, numberAffected, raw){
if(err) throw err;
//getting error here 'MongoError: not okForStorage'
});
}
}
});
假設保留數據類似於
data.foo = ['10','20','30'];
data.bar = [[11,12,13],[21,22,23],[31,32,33]];
我想如何將數據插入數據庫
{
foo : 10,
totalcounter : 1,
counter :{ date : 20131231,counter : 1},
bar : {[ foo : 11,totalcounter : 1,counter : {date : 20131231,counter : 1}],
[foo : 12,totalcounter : 1,counter : {date : 20131231,counter : 1}],
[foo : 13,totalcounter : 1,counter : {date : 20131231,counter : 1}]
}
}
此外,即使我明確指定時間,例如“ 20131231”。 它將被忽略,而是改為保存ISODate類型的默認時間(1970-01-01T05:35:40.109Z)。 我了解我需要遵循IOSDate格式類型來存儲日期。 但是出於某種原因,我不希望它包含小時數或分鍾/秒。 除了將“日期”設置為Number對象之外,還有什么有效的方法嗎?
感謝您的協助。
第一個更新代碼正常運行。 但是我在插入“ bar”的第二次更新查詢中收到錯誤“ not okForStorage”。
根據您粘貼的代碼,我不確定第一次更新如何成功執行。 在這兩種情況下,您都將更新運算符和字段替換混合在同一個更新對象( update()
的第二個參數)中。 db.collection.update()
文檔中對此進行了討論,它也適用於驅動程序。
在第一次更新中,您的意思是設置counter.date
字段並增加其他兩個字段,因此您的更新對象應為:
{
$inc: { totalcounter : 1, "counter.counter": 1 },
$set: { date : dateformat(new Date(), "yyyymmdd") }
}
關於示例文檔,您寫道:
我想如何將數據插入數據庫:
{ foo : 10, totalcounter : 1, counter :{ date : 20131231,counter : 1}, bar : {[ foo : 11,totalcounter : 1,counter : {date : 20131231,counter : 1}], [foo : 12,totalcounter : 1,counter : {date : 20131231,counter : 1}], [foo : 13,totalcounter : 1,counter : {date : 20131231,counter : 1}] } }
我假設您的示例值bar
有一些錯字。 那應該是一個對象數組嗎? 如果是這樣,如果您打算將新對象附加到數組,則可能應該使用數組更新運算符之一 ,例如$push
。 相反,如果您打算使用常規修飾符(例如$inc
, $set
)更新現有的數組元素,則可以引用以點語法更新的字段,例如bar.0.counter
作為第一個對象中的counter
字段在bar
數組中。
此外,即使我明確指定時間,例如“ 20131231”。 它將被忽略,並改為保存ISODate中的默認時間(“ 1970-01-01T05:35:40.109Z”)。 我了解我需要遵循IOSDate格式類型來存儲日期。 但是出於某種原因,我不希望它包含小時數或分鍾/秒。 除了將“日期”設置為Number對象之外,還有什么有效的方法嗎?
我假設您的Mongoose模式映射了date
字段,並且字符串'20131231'
不是有效的構造函數參數,因此將創建一個空的ISODate。 BSON日期類型將自紀元以來的毫秒數存儲為64位整數。 如果您想忽略小時數和較小的時間量度,則只需為所有這些量度創建一個零時間戳即可。
如果您堅持為date
字段存儲“ YYYYMMDD”字符串,則只需要在Mongoose中更改映射即可,因此該字段是基本字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.