2016-03-24 10 views
1

私は、複数のユーザーが何らかの値を持っているかどうかを調べる場所を使用する、かなり複雑なMongoDB Operatorを持っています。私の問題は、それがチェックする値が異なる場合がありますので、私の$ setは私が変更するプロパティを得るために文字列を一緒に追加する必要があるということです。これは私が何を意味するかである:「profile.chatInfo.subscribedRooms」を

users.update({$where:function() { 
    return this.profile.chatInfo.subscribedRooms.hasOwnProperty(findChatroom._id); 
}},{$set: {"profile.chatInfo.subscribedRooms."+findChatroom._id:false}},{multi:true} 
) 

そのコードでは動作しない唯一のことは、私は追加$セットで一部です+ findChatroom._id

別私が試したことは、追加された文字列と等しい変数を作成し、その変数を使用することでしたが、それもうまくいきませんでした。私は実際にここでやろうとしています何

var addedString = "profile.chatInfo.subscribedRooms."+findChatroom._id; 
users.update({$where:function() { 
    return this.profile.chatInfo.subscribedRooms.hasOwnProperty(findChatroom._id); 
}},{$set: {addedString:false}},{multi:true} 
) 

は、チャットメッセージが送信されたときに、このオペレータが実行されていることです。部屋に登録されているすべてのユーザを探し、その値をfalseに設定します。 trueまたはfalseの値は、ユーザーがチャットを読んだかどうかを示します。これは通知に使用されます。

編集:私の質問は、thisと重複していません。なぜなら、MongoDBのsetコマンドは、単にオブジェクトのプロパティの値を変更するのとは異なる働きをするからです。それに加えて、MongoDBはobject [property]という表記を使うことさえできません。なぜならドキュメントは埋め込みフィールドにアクセスする唯一の方法はドット表記法だからだと言うからです。

+1

可能な重複http://stackoverflow.com/questions/695050/how-、このようなものでなければなりませんdo-i-add-a-property-to-a-javascript-object-as-the-nameという名前) –

+0

また、 'var query = {};基本的に同じ方法でupdate文を設定するだけでなく、query [profile.chatInfo.subscribedRooms + findChatroom._id] = {"$ exists":true} 'は' $ where'を使うよりはるかに優れています。 「名前付きキー」の使用は恐ろしいデザインです。 –

+0

さて、アドバイスありがとう、私はそれを使用する方法を知らないので、私はクエリを使用する方法を調べます。なぜ重複していないのかを説明するために投稿を編集しました。 – Weastie

答えて

2

実際に@BlakesSevenが提供したリンクがあなたの問題を解決します。それは

var addedString = "profile.chatInfo.subscribedRooms."+findChatroom._id; 
var $set = {}; 
$set[addedString] = false; 

users.update({$where:function() { 
    return this.profile.chatInfo.subscribedRooms.hasOwnProperty(findChatroom._id); 
}}, { $set: $set }, { multi:true }) 
[私は名前として変数を使用して、JavaScriptのオブジェクトにプロパティを追加するにはどうすればよい?](の
関連する問題