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.
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); }); –
Ich habe meine Frage mit Ihrer Anfrage aktualisiert. Daten: [Daten: 1382], das scheint das letzte Element zu sein. – joncon