2017-05-23 17 views
0

私のユーザオブジェクトにはtimeslotオブジェクト(下記参照)を含むタイムスロット配列が含まれています。MongoDBは複数の条件をクエリします

"username" : "bla", 
"timeslots" : [ 
     { 
       "lab" : 0, 
       "timestamp" : 1495494000000, 
       "durationfactor" : 4 
     }, 
     { 
       "lab" : 1, 
       "timestamp" : 1495494000000, 
       "durationfactor" : 4 
     }, 
     { 
       "lab" : 3, 
       "timestamp" : 1495508400000, 
       "durationfactor" : 4 
     } 

これらのオブジェクトを更新すると、私は外れ値の大文字と小文字を区別します。

マイ更新クエリ(外れ値事例):

db.users.update(
    {"timeslots.timestamp" : 1495494000000, "timeslots.lab": 1}, 
    { $set: {"timeslots.$.timestamp" : 1495508400000,"timeslots.$.durationfactor" : 4}} 
    ,false 
    ,true 
); 

タイムスタンプと研究室が特定の値に等しい場合、基本的には(少なくともそれが必要)チェックします。この組み合わせはユニークです(ラボは同じタイムスタンプで重なり合うことはできず、使用中です)

これは、同じタイムスタンプ上に2つの異なるラボがある場合を除いてうまくいきます。

提供されている例では、ラボ1はラボ3の時点に更新されると予想しますが、結果はラボ0が代わりに更新されます。

同じラボで2つの異なるタイムスタンプ(逆の場合)がある場合、この現象は発生しません。だから今は本当に唖然としている。

私は{"$and":を使用して、助けにならなかった結合クエリ条件を強制的に使用しようとしました。

私は、更新クエリがtimeslots配列の最初の要素を更新するだけであると仮定していますが、それを修正する手がかりはありません。

答えて

1

$elemMatch

$ elemMatch演算子は、指定されたすべてのクエリ条件に一致する少なくとも一つの要素を持つ配列フィールドを含む文書が一致します。

db.users.update(
    {"timeslots" : { "$elemMatch":{"timestamp": 1495494000000, "lab": 1}}}, 
    { $set: {"timeslots.$.timestamp" : 1495508400000,"timeslots.$.durationfactor" : 4}} 
    ,false 
    ,true 
); 
関連する問題