2017-01-11 11 views
3

ここは私のスキーマです。オブジェクトの配列で複数のドキュメントを更新するmongooseのフィールド値

Home = new Schema({ 
     name: { type: String, required: true}, 
     description: {type: String}, 
     administrator: {type : mongoose.Schema.Types.ObjectId, ref: 'User', required: true}, 

    users: [{ 
     _id: {type : mongoose.Schema.Types.ObjectId, ref: 'User'}, 
     email: {type: String}, 
     name: { type: String}, 
     status: { type: Number} 
    }], 
    rooms: [Room] 


}); 
module.exports = mongoose.model('Home', Home); 

私は、複数のドキュメント間で特定のユーザを検索したい場合は、私は

Home.find({ "users.email": "[email protected]"}行うことができ、{ユーザーを:1})

これはusers.email = [email protected]

しかし、ユーザーのフィールドが配列であると、すべての家庭を返します。

"users" : [ 
     { 
      "status" : 0, 
      "name" : "Yaknow", 
      "email" : "[email protected]", 
      "_id" : ObjectId("5875a42ea469f40c684de385") 
     }, 
     { 
      "status" : 1, 
      "name" : "johnk", 
      "email" : "[email protected]", 
      "_id" : ObjectId("586e31c6ce07af6f891f80fd") 
     } 
    ] 

は、したがって、上記のクエリは、ユーザーがメールを持って各家の各ユーザーの配列を返します(多くの家庭がある場合、これがこのように多くの配列となり、わずか1家からである)。 マイ質問は、JohnKirtsterのすべてのインスタンスをJohnKirtsterに更新するにはどうすればよいですか? JohnKirster

Home.updateに、配列の名前のすべてのユーザーを更新してしまう、これを使用して (クエリは、{users.name: "JohnKirsterは、"})

答えて

12

あなたがmulti:true

を設定することにより、MongoDBの $ positional operator使用することができます
Home.update(
{"users.name": "johnk"}, //query, you can also query for email 
{$set: {"users.$.name": "JohnKirster"}}, 
{"multi": true} //for multiple documents 
) 
+0

これはトリックです。前に位置演算子を使用していない。小さな型ですが、{"multi":true}ですが、これが解決します。 – TradeRaider

関連する問題