簡體   English   中英

MongoDB,Node.Js(mongoose)中的okForStorage錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM