0

erstellt wird. Bitte beachten Sie die Bearbeitungen unten. Dies scheint ein Mongo-C- oder natives Node-Mongodb-Problem zu sein und kein Mongoose-Problem.Nativer Knoten mongodb-Treiber gibt das korrekte Dokument zurück, aber mit leerem Zahlen-Array, wenn von Mongo-C

Ich habe eine Echtzeit-Sammlung von seismischen Daten in MongoDB gespeichert. Ein Schlüssel, Daten genannt, ist ein int-Array von Samples. Wenn ich diese Sammlung über Mongoose abfrage, sieht alles gut aus, aber der Datenschlüssel kommt als leeres Array zurück, wenn er als Number-Array der Länge nsamp (Anzahl der Samples) zurückkommen soll.

I definiert haben das Mongoose Schema als:

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

über Mongo den folgenden Datensatz abfragen

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

Es gibt

{ "_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 ] 
     } 

Aber wenn ich das gleiche Abfrage in Mongoose Das Datenfeld ist leer:

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); 
    }); 
}); 

ich die folgende Konsole Ausgabe:

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

Bin ich richtig, das Schema zu definieren?

Edit 1:

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

Ausbeuten:: das Skript zu ändern

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

Edit 2: Nach dem Versuch wird das darüber dies der nativen mongodb Treiber sein kann. Ich änderte meinen Skript:

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(); 
     }); 
}); 

und bekam das gleiche Ergebnis wie bearbeiten 1.

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

Bearbeiten 3: Die MongoDB Sammlung ist über ein C-Programm gefüllt, das Mongo-CI erstellt drei ähnliche Dokumente verwendet : 1) über Mongo-C-Routine (Original), 2) Node-Mongodb und 3) Mongo-Konsole. Sie erscheinen in der Mongo-Konsole ähnlich, wenn ich eine Suche mache (außer ID und Schlüsselname), so dass ich nicht das Bedürfnis habe, die Ausgabe hinzuzufügen, es sei denn, jemand möchte sie wirklich haben. Ich änderte meine Knoten Skript auf die folgenden:

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(); 
     }); 
}); 

Welche ergibt:

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 

ich ein Ruby-Skript erstellt, das Mongo Juwel mit und war in der Lage, alle drei Arrays zu lesen.

+0

Können Sie auf diese Weise versuchen: Cwave.find ({ "_ id": "5733bedeadb31b2b8a0fef2e"}).. Mager() exec (function (err, cwaves) { if (err) return console.error (err) ; console.log (cwaves); }); –

+0

Ich habe meine Frage mit Ihrer Anfrage aktualisiert. Daten: [Daten: 1382], das scheint das letzte Element zu sein. – joncon

Antwort

0

Dies stellte sich als ein Fehler bei der Erstellung des Arrays mit libbson heraus. Der Array-Bauteil in meinem C-Code war:

bson_append_int32 (m_data, "Daten", -1, long_data [i]);

Das zweite Argument ist der Schlüssel, der dachte ich sollte die Array-key „Daten“ sein. Aber es sollte der Index als String sein.

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

so das Array baut Teil wird:

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);        

Ich verstehe nicht, warum die erste Version mit der Mongo-Konsole oder die Ruby-Bibliothek gearbeitet.