2017-11-15 3 views
0

私は、誰かが助けてくれることを願ってこのサークルで回ります。私はノードからセンサー値を受け取るnodejsアプリケーションを構築しています。あるノード上に複数のセンサーが存在する可能性があります。私がノードに追加し、センサー上にセンサーをプッシュすることができSubDocアレイのMongo SubDocにプッシュ

var mongoose = require('mongoose'); 

var Schema = mongoose.Schema; 

var valueSchema = new Schema ({ 
    timestamp: {type: Date}, 
    value: {} 
}); 

var sensorSchema = new Schema ({ 
    id: {type: Number}, 
    type: {type: String}, 
    description: {type: String}, 
    ack: {type: Boolean}, 
    values: [valueSchema] 
}); 

var SensorNode = mongoose.model('SensorNode', { 
    id: {type: Number, required: true}, 
    protocol: {}, 
    sensors: [sensorSchema] 
}); 

:私は、次のスキーマに&モデルを構築したNodeJS、mongodはDBとマングース、ラズベリーパイで実行されているすべての、3を使用して

配列が、値の配列に値をプッシュできないようです。

私は、同様の問題に関するいくつかの例と質問を見てきましたが、人口を使ってみましたが、動作しないようです。この結果、このエラーのため、undefinedを返している

function saveValue(rsender, rsensor, payload) { 

    var value = { 
    values: { 
     timestamp: new Date().getTime(), 
     value: payload 
    } 
    } 

    SensorNode.findOneAndUpdate({ 

    "id": rsender, 
    "sensors.id": rsensor 
    }, { 
    "$push": { 
     "sensors.$": value 
    } 
    }, function(err, result) { 

    if (err) { 
     console.log(err); 
    } 
    console.log(result); 
    }); 

} 

は、ここに私のコードです

MongoError: exception: Cannot apply $push/$pushAll modifier to non-array 

値は間違いなくセンサースキーマの配列です。

私はUIのために自動割り当てされたMongo DB IDではなく読み込み可能なIDを使用していますが、違いがあればMongoDB _idを使用できます。

どこが間違っていますか?

答えて

0

あなたがそうのがdocs

The positional $ operator identifies an element in an array to update without explicitly specifying the position of the element in the array. To project, or return, an array element from a read operation, see the $ projection operator.

ので、センサーをチェックしてみましょう、位置演算子$を使用している。$あなたのセンサのアレイから1つの特定の文書を返します。だからこそあなたは誤りを抱えています。このレベルの文書では、$ setを使用してこの項目を置き換えることができます。

SensorNode.findOneAndUpdate({ 

    "id": rsender, 
    "sensors.id": rsensor 
    }, { 
    "$push": { 
     "sensors.$.values": payload 
    } 
    }); 

この操作はちょうどrsensorに等しいidを持つある特定のセンサの値の配列へのペイロードを追加します:私はあなたがこのような何かをやってみたかった賭けます。

+0

ああ、美人!ありがとう!私が変更しなければならなかったもう一つのことは、値のオブジェクトを値の変数から削除することでした。ちょうど2つのフィールドに残っていて、完全に機能しました。乾杯 – MSanders

関連する問題