1 { 2 "__v": 1, 3 "_id": "538f5f0f6195a184108c8bd8", 4 "title": "GameTitle", 5 "item": [{ 6 "_id": "538f5f0f6195a184108c8bd6", 7 "name": "itemOne", 8 "men": [{ 9 "_id": "5390cccf0a84f41f37082874", 10 "user": "id22222222", 11 "score": 2000 12 }, { 13 "_id": "2390cccf0a84f41f37082873", 14 "user": "id33333333", 15 "score": 1000 16 }] 17 }, { 18 "_id": "538f5f0f6195a184108c8bd7", 19 "name": "itemTwo", 20 "men": [] 21 }], 22 "status": 1 23 } 24 25 26 //代码是: 27 var MenSchema = new mongoose.Schema({ 28 user: ‘String‘, 29 score: { 30 type: Number, 31 default: 0 32 } 33 }); 34 35 var ItemsSchema = new mongoose.Schema({ 36 name: String 37 ,men: [MenSchema] 38 }); 39 40 ListsSchema = new mongoose.Schema({ 41 title: { 42 type: String, 43 required: true 44 } 45 ,item: [ItemsSchema] 46 }); 47 48 var Items = mongoose.model(‘item‘, ItemsSchema); 49 var Lists = mongoose.model(‘lists‘, ListsSchema); 50 var Men = mongoose.model(‘men‘, MenSchema); 51 Insert and update: 52 53 function commit(sId, sItem, sUser, sIncreaseScore) { 54 Lists.findOne({, "_id": sId, 55 "item.name": sItem 56 }, null, function(err, documents) { 57 if (!err) { 58 if (documents != null) { 59 Lists.findOne({ 60 "_id": sId, 61 "item.name": sItem, 62 "item.men.user": sUser 63 }, null, function(err, subDoc) { 64 if (!err) { 65 if (subDoc != null) { 66 //increase user score 67 //!!!!!!!!!!!!!But subDoc will get all arrays of item.men, so I can‘t update it correctly 68 } else { 69 //inser new user score 70 var userData = new Men({ 71 user: sUser, 72 score: sScore 73 }); 74 75 documents.item[0].men.push(userData); 76 documents.save(function(err) { 77 if (!err) { 78 ///!!!!!!!!!!!!!!Will come this 79 console.log("documents error on save!"); 80 } else { 81 console.log("save documents ok!"); 82 } 83 }); 84 } 85 } 86 }); 87 } 88 } else { 89 console.log("not find the game item!"); 90 } 91 } 92 ); 93 }
这种查询方法比较特殊,直接用子文档的属性作为查询条件
"item.men.user": sUser 也可以这样查找:
Lists.items.men.id("id"); 此时查到的就是子文档中的某一条,而不是整个父文档, 执行删除
Lists.items.men.id("id"); 在保存文档
时间: 2024-10-09 21:20:52