2016-05-07 2 views
0

mongo dbを初めて使用しています。私はその文書内のフィールドが同じでない場合にのみ行を更新する必要がある特定の問題があります。以下はその例です特定のフィールドが同じでない場合、行をアップサンプリングする

以下は、& ASINのユニークフィールドとしてのデータです。

{ "_id" : ObjectId("572dc897bde92c7907ffaf71"), "seller" : "amazon", "ASIN" : "XYZ", "price" : 46, "lastUpdatedate" : ISODate("2016-05-07T10:59:11.165Z") } 

私は2つのタスクのうちの1つを持っています。

  1. は売り手& ASINは価格が同じでない場合にのみ、上記のidユニーク

  2. 更新されている場合にのみ、新しい行を挿入します。例同じ販売者& ASINを価格:47でアップした場合、上記の行がアップし、価格が46の場合は変更が行われません。 値が変更されない場合、フィールドlastUpdatedateは理想的には変わらないはずです。この後

私はLASTUPDATEDATEで行のみを照会します昨日<を変更し、他のモジュールにデータをアップロードします。これにより、他のモジュールにアップロードするデータが大幅に削減されます。

助けてください。

答えて

0

まず問題

のMongoDBのupdateコマンドは...

オプションupsertのパラメータを持ってtrueに設定した場合、何の文書がクエリ基準に一致しないとき...、新しいドキュメントを作成します。

db.yourCollection.update({ seller: 'amazon', ASIN: 'XYZ'}, { ...your new document... }, { upsert: true })

それは売り手が「アマゾン」やASINある既存のドキュメントを見つけられない場合、これは新しい文書のみを挿入するためにMongoDBのを教えてくれます:あなたはそれをこのように使用することができます

「XYZ」です。 の場合は既存の文書を検索しますが、それは新しい文書と置き換えられますが、あなたの状況を理解する限り、これは関係ありません。

新しいものが既存のものよりも高い場合にのみ、あなたは...

$max演算子を使用することができ、価格フィールドを更新するために、第2の問題

に...更新指定された値がフィールドの現在の値より大きい場合、フィールドの値を指定された値に設定します。

あなたはそれをこのように使用することができます。 db.yourCollection.update({ seller: 'amazon', ASIN: 'XYZ'}, { $max: {price: newPrice} }, { upsert: true })

LASTUPDATEDATEフィールドについて - 私は条件付きで同じ更新操作中に、それを更新するための方法を考えることはできません。私は価格が更新されたかどうかを判断するために更新操作の結果を得る必要があると思います。もしそうなら、lastUpdatedateを更新してください。

0
  1. 売り手とASINの組み合わせが一意である場合。あなたはそれらに一意のインデックスを作成する必要があります。それは決して類似した売り手とASINの組み合わせで新しい文書を挿入(upsert)しません。 Ref。更新のクエリ文書のその後Compound-unique-index
  2. は、1つの以上の条件$ne: {"price":new_price}

だから、決してアップサート(挿入)新しいドキュメントを追加し、価格は同じである場合も、既存のドキュメントを更新しません。

関連する問題