MongoDB中数组元素的插入顺序

时间:2014-12-15 19:49:14

标签: node.js mongodb

我无法将批量插入的插入顺序保留到mongodb中。

我的应用程序需要连续(通过HTTP POST @每秒一次)向服务器发布数据。在服务器端,处理HTTP POST,并将此数据存储在mongodb v2.4中的上限集合中。这个上限集合的大小很大(50MB)。这个数据的格式是JSON,它的数组如下:

{"Data":[{"Timestamp":"2014-08-02 13:38:18:852","Rabbit":[{"a":-0.0010663296561688185,"c":-0.0021321268286556005,"b":-0.0010663296561688185}],"Monkec":[{"a":17.511783599853516,"c":-0.42092469334602356,"b":-0.42092469334602356}]},{"Timestamp":"2014-08-02 13:38:18:858","Rabbit":[{"a":-0.0021321268286556005,"c":-0.0010663296561688185,"b":0.0010657970560714602}],"Monkec":[{"a":9.892329216003418,"c":-0.2339634746313095,"b":-0.2342628538608551}]},{"Timestamp":"2014-08-02 13:38:18:863","Rabbit":[{"a":-0.0010663296561688185,"c":-0.0021321268286556005,"b":0.0021315941121429205}],"Monkec":[{"a":9.702523231506348,"c":-0.24264541268348694,"b":-0.2148033082485199}]},{"Timestamp":"2014-08-02 13:38:18:866","Rabbit":[{"a":-0.0010663296561688185,"c":-0.0010663296561688185,"b":0.0010657970560714602}],"Monkec":[{"a":9.665101051330566,"c":-0.23366409540176392,"b":-0.2197430431842804}]},{"Timestamp":"2014-08-02 13:38:18:868","Rabbit":[{"a":-0.0021321268286556005,"c":-0.0010663296561688185,"b":0.0010657970560714602}],"Monkec":[{"a":9.693991661071777,"c":-0.2936892807483673,"b":-0.22857467830181122}]},{"Timestamp":"2014-08-02 13:38:18:872","Rabbit":[{"a":-0.0010663296561688185,"c":-0.0010663296561688185,"b":0.0010657970560714602}],"Monkec":[{"a":9.684710502624512,"c":-0.2296224981546402,"b":-0.13786330819129944}]},{"Timestamp":"2014-08-02 13:38:18:873","Rabbit":[{"a":-0.0021321268286556005,"c":-0.0010663296561688185,"b":0.0010657970560714602}],"Monkec":[{"a":9.67707633972168,"c":-0.31255003809928894,"b":-0.1902543604373932}]},{"Timestamp":"2014-08-02 13:38:18:875","Rabbit":[{"a":-0.0021321268286556005,"c":-0.0010663296561688185,"b":0}],"Monkec":[{"a":9.739496231079102,"c":-0.1899549812078476,"b":-0.18845809996128082}]},{"Timestamp":"2014-08-02 13:38:18:878","Rabbit":[{"a":-0.003197923768311739,"c":-0.0010663296561688185,"b":0.0010657970560714602}],"Monkec":[{"a":9.721234321594238,"c":-0.19205063581466675,"b":-0.17318984866142273}]},{"Timestamp":"2014-08-02 13:38:18:881","Rabbit":[{"a":-0.003197923768311739,"c":-0.003197923768311739,"b":0.0010657970560714602}],"Monkec":[{"a":9.78545093536377,"c":-0.2501298487186432,"b":-0.1953437775373459}]},{"Timestamp":"2014-08-02 13:38:18:882","Rabbit":[{"a":0,"c":-0.0010663296561688185,"b":0.0021315941121429205}],"Monkec":[{"a":9.686058044433594,"c":-0.21630020439624786,"b":-0.18247054517269135}]},{"Timestamp":"2014-08-02 13:38:18:884","Rabbit":[{"a":-0.0010663296561688185,"c":0,"b":0.0010657970560714602}],"Monkec":[{"a":9.67198657989502,"c":-0.18546432256698608,"b":-0.23156845569610596}]},{"Timestamp":"2014-08-02 13:38:18:887","Rabbit":[{"a":-0.0010663296561688185,"c":-0.0010663296561688185,"b":0.0010657970560714602}],"Monkec":[{"a":9.640103340148926,"c":-0.23276595771312714,"b":-0.25686585903167725}]},{"Timestamp":"2014-08-02 13:38:18:889","Rabbit":[{"a":-0.0010663296561688185,"c":0,"b":0}],"Monkec":[{"a":9.739346504211426,"c":-0.19130218029022217,"b":-0.22602996230125427}]},{"Timestamp":"2014-08-02 13:38:18:891","Rabbit":[{"a":-0.0021321268286556005,"c":-0.0010663296561688185,"b":0}],"Monkec":[{"a":9.716594696044922,"c":-0.22543121874332428,"b":-0.19728973507881165}]},{"Timestamp":"2014-08-02 13:38:18:898","Rabbit":[{"a":-0.0010663296561688185,"c":-0.0010663296561688185,"b":0.0010657970560714602}],"Monkec":[{"a":9.682914733886719,"c":-0.28680360317230225,"b":-0.1740879863500595}]},{"Timestamp":"2014-08-02 13:38:18:904","Rabbit":[{"a":-0.0010663296561688185,"c":0,"b":0.0021315941121429205}],"Monkec":[{"a":9.693093299865723,"c":-0.20866607129573822,"b":-0.2586621046066284}]},{"Timestamp":"2014-08-02 13:38:18:907","Rabbit":[{"a":-0.0021321268286556005,"c":-0.0010663296561688185,"b":0}],"Monkec":[{"a":9.690997123718262,"c":-0.18681152164936066,"b":-0.23216719925403595}]},{"Timestamp":"2014-08-02 13:38:18:910","Rabbit":[{"a":-0.003197923768311739,"c":-0.0010663296561688185,"b":0.0010657970560714602}],"Monkec":[{"a":9.671688079833984,"c":-0.15388000011444092,"b":-0.2588118016719818}]},{"Timestamp":"2014-08-02 13:38:19:055","Rabbit":[{"a":-0.0010663296561688185,"c":-0.0010663296561688185,"b":0}],"Monkec":[{"a":9.689650535583496,"c":-0.23605911433696747,"b":-0.1989363133907318}]}],"Serial":"35689"}

我使用批量插入命令在mongodb中插入(使用NodeJs MongoClient驱动程序):

    var length = 20; // only doing 20 inserts for testing purposes
    for (var i = 0; i <length;i++) {        
    var bulk = col.initializeUnorderedBulkOp();
    bulk.insert(data["Data"][i]); // data is my JSON data of interest

    bulk.execute(function(err) {
    if (err) {
      return cb(err);
    }

    if (++inserted == length) {
       cb(); // callback (not seen in this code snippet)
    }
  }); // end function
  } // end of for loop

但是,当我检查数据库中的条目时,它们不会按照数据驻留在原始JSON数组中的顺序插入。我的源数据按升序时间戳顺序排列,但mongodb上限集合中的一些条目无序。例如,我看到了这个:

{ "Timestamp" : "2014-08-02 13:38:18:910", "Rabbit" : [     {   "a" : -0.003197923768311739,    "c" : -0.0010663296561688185,   "b" : 0.0010657970560714602 } ], "Monkec" : [   {   "a" : 9.671688079833984,    "c" : -0.15388000011444092,     "b" : -0.2588118016719818 } ], "_id" : ObjectId("548e67a683946a5d25bc6d1a") }

{ "Timestamp" : "2014-08-02 13:38:18:884", "Rabbit" : [  {  "a" : -0.0010663296561688185,  "c" : 0,  "b" : 0.0010657970560714602 } ], "Monkec" : [  {   "a" : 9.67198657989502,     "c" : -0.18546432256698608,     "b" : -0.23156845569610596 } ], "_id" : ObjectId("548e67a683946a5d25bc6d13") }

{ "Timestamp" : "2014-08-02 13:38:18:904", "Rabbit" : [  {  "a" : -0.0010663296561688185,  "c" : 0,  "b" : 0.0021315941121429205 } ], "Monkec" : [  {   "a" : 9.693093299865723,    "c" : -0.20866607129573822,     "b" : -0.2586621046066284 } ], "_id" : ObjectId("548e67a683946a5d25bc6d18") }

所以Timestamp“:”2014-08-02 13:38:18:910存储在“Timestamp”:“2014-08-02 13:38:18:884”之前,即使它是另一种方式源JSON。

如何确保mongodb以正确的顺序插入数据?我也尝试过非批量插入(db.col.insert或db.col.insertOne),但仍然会出现这种不一致。谢谢

1 个答案:

答案 0 :(得分:1)

如果您的查询没有要求任何特定的排序/排序,MongoDB不保证它们将以何种顺序返回。

如何插入数据无关紧要。您需要做的是编写 find 查询,如下所示:

// Sort by ascending timestamp
db.my_collection.find({ ... }).sort({"TimeStamp": 1})

有关排序如何运作的详细信息,请参阅http://docs.mongodb.org/manual/reference/method/cursor.sort/#cursor.sort

当然,如果您想这样做,您可以通过Timestamp向您的收藏集添加索引(参见http://docs.mongodb.org/manual/core/indexes/),从而获益匪浅。

相关问题