0

下部の編集を参照してください。これは Mongo-C やネイティブの node-mongodb の問題であり、Mongoose の問題ではないようです。

MongoDB に保存されている地震データのリアルタイム コレクションがあります。データと呼ばれる 1 つのキーは、サンプルの int 配列です。Mongoose を介してこのコレクションをクエリすると、すべて正常に見えますが、データ キーは空の配列として返されますが、長さ nsamp(サンプル数) の Number 配列として返されるはずです。

Mongoose スキーマを次のように定義しました。

var waveformSchema = new Schema({
    key:        String,
    nsamp:      Number,
    starttime:  Number,
    endtime:    Number,
    samprate:   Number, 
    datatype:   String,
    data:       [Number]
 });

mongo 経由で次のレコードを照会する

db.cwaves.find({"_id" : ObjectId("5733bedeadb31b2b8a0fef2e")})

戻る

{ "_id" : ObjectId("5733bedeadb31b2b8a0fef2e"), 
"key" : "BROK.HNZ.UW.--", "nsamp" : 172, 
"starttime" : 1463008988.38, "endtime" : 1463008989.2350001,
"samprate" : 200, "datatype" : "i4", 
"data" : [ 1385, 1384, 1385, 1384, 1381, 1386, 1390, 1381, 1385,
           1387, 1382, 1387, 1384, 1381, 1385, 1386, 1384, 1382,
           1383, 1384, 1386, 1384, 1381, 1385, 1386, 1384, 1386,
           1386, 1385, 1385, 1387, 1382, 1383, 1386, 1381, 1382,
           1384, 1382, 1383, 1386, 1386, 1382, 1383, 1386, 1384,
           1385, 1385, 1384, 1387, 1387, 1383, 1383, 1388, 1385,
           1384, 1387, 1382, 1383, 1385, 1384, 1385, 1384, 1383,
           1385, 1384, 1383, 1387, 1382, 1386, 1387, 1381, 1386,
           1386, 1390, 1386, 1383, 1388, 1381, 1384, 1389, 1385,
           1384, 1386, 1387, 1384, 1382, 1384, 1382, 1378, 1387,
           1390, 1383, 1385, 1383, 1381, 1384, 1385, 1387, 1380,
           1379, 1387, 1383, 1384, 1384, 1384, 1385, 1382, 1389,
           1389, 1381, 1385, 1388, 1387, 1386, 1383, 1386, 1383,
           1382, 1385, 1382, 1384, 1386, 1383, 1382, 1385, 1386,
           1386, 1387, 1385, 1382, 1380, 1383, 1387, 1378, 1382,
           1388, 1383, 1385, 1387, 1385, 1386, 1388, 1386, 1384,
           1382, 1382, 1385, 1385, 1384, 1378, 1384, 1387, 1383,
           1383, 1382, 1384, 1384, 1388, 1386, 1380, 1386, 1388,
           1386, 1383, 1384, 1384, 1383, 1387, 1385, 1384, 1386,
           1382 ] 
      }

しかし、Mongoose で同じクエリを実行すると、データ配列は空になります。

var mongoose = require('mongoose')
    , assert = require('assert')
    , app = require('express')()
    , http = require('http').Server(app)
    , io = require('socket.io')(http);

//schema stuff and things
var Schema = mongoose.Schema;
var waveformSchema = new Schema({
  key:        String,
  nsamp:      Number,
  starttime:  Number,
  endtime:    Number,
  samprate:   Number, 
  datatype:   String,
  data:       [Number]
});


var Cwave = mongoose.model('Cwave', waveformSchema);
//get configs
var Conf = require("./config.js"); //config file
var conf = new Conf();
//Connect to Mongo
var url = "mongodb://" + conf.mongo.user + ":" + conf.mongo.passwd + "@" 
  + conf.mongo.host + ":" + conf.mongo.port + "/" + conf.mongo.dbname 
  + "?authMechanism=" + conf.mongo.authMech + "&authSource=" + conf.mongo.authSource;

mongoose.connect(url);

var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function() {
   Cwave.find({"_id" : "5733bedeadb31b2b8a0fef2e"}, function(err, cwaves){
     if (err) return console.error(err);
     console.log(cwaves);
    });
});

次のコンソール出力が得られます。

listening on port: 8888
[ { data: [],
  datatype: 'i4',
  samprate: 200,
  endtime: 1463008989.2350001,
  starttime: 1463008988.38,
  nsamp: 172,
  key: 'BROK.HNZ.UW.--',
  _id: 5733bedeadb31b2b8a0fef2e } ]

スキーマを正しく定義していますか?

編集1:スクリプトを次のように変更します:

  Cwave.find({"_id":"5733bedeadb31b2b8a0fef2e"}).lean().exec(
        function(err, cwaves){ if (err) return console.error(err);
        console.log(cwaves); })

収量:

[ { _id: 5733bedeadb31b2b8a0fef2e,
    key: 'BROK.HNZ.UW.--',
    nsamp: 172,
    starttime: 1463008988.38,
   endtime: 1463008989.2350001,
   samprate: 200,
   datatype: 'i4',
   data: [ data: 1382 ] } ]

編集 2: 上記を試した後、これはネイティブの mongodb ドライバーである可能性があります。スクリプトを次のように変更しました。

var  MongoClient  = require('mongodb').MongoClient
    , assert = require('assert')
    , app = require('express')()
    , http = require('http').Server(app)
    , io = require('socket.io')(http);

//get configs
var Conf = require("./config.js"); //config file
var conf = new Conf();
//Connect to Mongo
var url = "mongodb://" + conf.mongo.user + ":" + conf.mongo.passwd + "@" 
      + conf.mongo.host + ":" + conf.mongo.port + "/" + conf.mongo.dbname 
      + "?authMechanism=" + conf.mongo.authMech + "&authSource=" + conf.mongo.authSource;



MongoClient.connect(url, function(err, db) {
    if(err) throw err;
    var collection = db.collection('cwaves');
    collection.find({starttime: 1463008988.38, key: "BROK.HNZ.UW.--"}).toArray(function(err, results) {
        console.log(results);
        db.close();
      });
});

編集1と同じ結果が得られました。

[ { _id: 5733bedeadb31b2b8a0fef2e,
    key: 'BROK.HNZ.UW.--',
    nsamp: 172,
    starttime: 1463008988.38,
   endtime: 1463008989.2350001,
   samprate: 200,
   datatype: 'i4',
   data: [ data: 1382 ] } ]

編集 3: MongoDb コレクションは、Mongo-CI を使用する C プログラムを介して作成されます。1) mongo-c ルーチン (オリジナル)、2) node-mongodb、および 3) Mongo Console を介して 3 つの同様のドキュメントが作成されます。find (id とキー名を除く) を実行すると、mongo コンソールに似たように表示されるため、誰かが本当に必要でない限り、出力を追加する必要はありません。ノードスクリプトを次のように変更しました。

MongoClient.connect(url, function(err, db) {
    if(err) throw err;
    var collection = db.collection('cwaves');
    collection.find().toArray(function(err, results) {
        // console.log(result);
        for(var i=0; i< results.length; i++){
          console.log("key: " + results[i].key + " type: " + Object.prototype.toString.call(results[i].data) + " length: " + results[i].data.length);
        }
        db.close();
      });
});

どちらが得られますか:

key: BROK.HNZ.UW.-- type: [object Array] length: 0
key: mongo_console type: [object Array] length: 172
key: node-mongodb type: [object Array] length: 172

mongo gem を使用して Ruby スクリプトを作成し、3 つの配列すべてを読み取ることができました。

4

1 に答える 1

0

これは、libbson を使用して配列を構築する方法に誤りがあることが判明しました。私のCコードの配列構築部分は次のとおりです。

bson_append_int32 (m_data, "データ", -1, long_data[i]);

2 番目の引数はキーです。これは、配列キー「データ」である必要があると思いました。ただし、文字列としてのインデックスである必要があります。

http://api.mongodb.com/libbson/current/bson_append_int32.html

したがって、配列ビルド部分は次のようになります。

   char index[4];


   bson_append_array_begin (m_doc, "data", -1, m_data);
    for ( i = 0; i < trh->nsamp; i++ ){
      snprintf(index, 4, "%d", i);
      if ( (strcmp (trh->datatype, "s2")==0) || (strcmp (trh->datatype, "i2")==0) ){
        bson_append_int32 (m_data, index, -1, short_data[i]);
       }else{
         bson_append_int32 (m_data, index, -1, long_data[i]);
       }
      }
    bson_append_array_end (m_doc, m_data);                             

最初のバージョンが mongo コンソールまたは ruby​​ ライブラリを使用して機能した理由がわかりません。

于 2016-05-15T20:30:59.657 に答える