2017-01-24 11 views
1

ネイティブmongodbドライバを使用してノードJSでコマンドを作成して、ドキュメントオブジェクト内のオブジェクトからキー値のペアを削除しようとしています。MongoDBノードJS - ドキュメントオブジェクト内のオブジェクトからエントリを削除する

私は次の形式でのMongoDBのコレクションを持っている:

{ 
    "name" : "PrakashPM" 
    "data" : { 
       "Jan-2017" : "2,3,1", 
       "Dec-2016" : "1,2,0", 
       "Nov-2016" : "9,9,9" 
      } 
    }, 
    { 
    "name" : "Valavan" 
    "data" : { 
       "Jan-2017" : "1,1,1", 
       "Dec-2016" : "3,3,3", 
       "Nov-2016" : "9,9,9" 
      } 
    } 

私の目標は、 "12月-2016" を削除することです:内部で "1,2,0" "名前": " PrakashPM」

マイコード:

var mongoName = 'PrakashPM'; 
var mongoDate = "'data'.'Dec-2016'"; 
// TRIALS 
// var mongoDate = "data.'Dec-2016'"; 
// var mongoDate = "data.Dec-2016"; 


var mongoVal = "'1,2,0'"; 
// TRIALS 
// var mongoVal = "1,2,0"; 


mycollection.update({ name: mongoName }, 
{ $unset: {mongoDate : mongoVal} } 
); 

注:私は上記のオペラをやっていますPUTリクエスト機能の内部にあります。

入力値(mongoDate、mongoVal)にはさまざまな方法(トライアル)を試しましたが、私は以下の結果を得ることができません。

また、キーを使用するだけで、キー値ペアのエントリを削除することはできますか? (すなわち、この場合、{$解除:{mongoDate}}またはそのような何か)

期待される結果:

{ 
    "name" : "PrakashPM" 
    "data" : { 
       "Jan-2017" : "2,3,1", 
       "Nov-2016" : "9,9,9" 
      } 
    }, 
    { 
    "name" : "Valavan" 
    "data" : { 
       "Jan-2017" : "1,1,1", 
       "Dec-2016" : "3,3,3", 
       "Nov-2016" : "9,9,9" 
      } 
    } 
+1

'req.body'コンテンツのサンプルをさらに提供できますか?特に 'req.body.timerData'と' req.body.time'の違いは何ですか?あなたのコードで 'timerName'とは何ですか? –

+0

すべての混乱のために申し訳ありません。 @サンタヌス私は適切な値で質問を編集しました。 'find({name:mongoName}) 'を使ってレコードを取得できます。問題は$ unset条件にあるか、最初の引数で追加のクエリになる可能性があります。 – Mikki

+0

下記の返信をご覧ください。あなたの問題を明らかにし、解決策を提示しました。 –

答えて

1

をreq.body.timerDateが正確にMongoDBのように月 - 日付文字列値を持っていると仮定すると、これは動作するはずです。 (documentation参照)。

文字列をキーとして使用する必要があります。そこに変数名を使用することはできません。

// Assuming that req.body.timerDate 
// has the month-date as stored in MongoDB (case-sensitive match) 

var reqDate = "data." + req.body.timerDate; 
var reqName = req.body.name; 

var _unset = {}; 
_unset[reqDate] = ""; 

mycollection.update({ name: reqName }, { $unset: _unset }) 
0

あなたはオブジェクトのキーとして変数を使用しようとしています。

mycollection.update({ timerName: mongoName }, 
{ $unset: {mongoDate : mongoVal} } 
); 

これは期待どおりではなく、一般的なJavaScriptの概念です(mongodbの問題ではありません)。 キー "timerName"が変数 "mongoName"の内容と等しい行を更新するために、mongoにクエリを送信しています。 しかし、正しいキーは「名前」です。

これを試してみてください:

mycollection.update({ name: mongoName }, 
{ $unset: {data : mongoVal} } 
); 
+0

申し訳ありませんが、私の悪い。私は混乱を避けるために私の質問を編集しました。 'find({name:mongoName}) 'を使ってレコードを取得できます。問題は$ unset条件にあります。あなたの提案でも、データの代わりに、それは ''データ '' Dec-2017''または 'data.Dec-2017'であってはなりませんか?ところで、私の提案はうまくいきませんでした。 – Mikki

1

コレクションを更新するためのガイドとして、次の例を使用してください。あなたのクエリと更新文書を作成するためにbracket notationを使用する必要があるあなたが構造を有する更新操作が必要です。すなわち:あなたの操作で使用するオブジェクトを構築するために、変数を使用して、だから、

db.mycollection.update(
    { 'name': 'PrakashPM' }, 
    { 
     '$unset': { 
      'data.Dec-2016': '' 
     } 
    } 
) 

var mongoName = 'PrakashPM'; 
var timerDate = 'Dec-2016'; 
var query = {}; 
var update = {'$unset': {}}; 
query['name'] = mongoName; 
update['$unset']['data.'+timerDate] = ''; 

db.mycollection.update(query, update) 
関連する問題