mongoose怎么在子文档的array里update或insert?

arabicsara 2014-06-06 08:32:45

//数据库是:
{
"__v": 1,
"_id": "538f5f0f6195a184108c8bd8",
"title": "GameTitle",
"item": [{
"_id": "538f5f0f6195a184108c8bd6",
"name": "itemOne",
"men": [{
"_id": "5390cccf0a84f41f37082874",
"user": "id22222222",
"score": 2000
}, {
"_id": "2390cccf0a84f41f37082873",
"user": "id33333333",
"score": 1000
}]
}, {
"_id": "538f5f0f6195a184108c8bd7",
"name": "itemTwo",
"men": []
}],
"status": 1
}


//代码是:
var MenSchema = new mongoose.Schema({
user: 'String',
score: {
type: Number,
default: 0
}
});

var ItemsSchema = new mongoose.Schema({
name: String
,men: [MenSchema]
});

ListsSchema = new mongoose.Schema({
title: {
type: String,
required: true
}
,item: [ItemsSchema]
});

var Items = mongoose.model('item', ItemsSchema);
var Lists = mongoose.model('lists', ListsSchema);
var Men = mongoose.model('men', MenSchema);
Insert and update:

function commit(sId, sItem, sUser, sIncreaseScore) {
Lists.findOne({, "_id": sId,
"item.name": sItem
}, null, function(err, documents) {
if (!err) {
if (documents != null) {
Lists.findOne({
"_id": sId,
"item.name": sItem,
"item.men.user": sUser
}, null, function(err, subDoc) {
if (!err) {
if (subDoc != null) {
//increase user score
//!!!!!!!!!!!!!But subDoc will get all arrays of item.men, so I can't update it correctly
} else {
//inser new user score
var userData = new Men({
user: sUser,
score: sScore
});

documents.item[0].men.push(userData);
documents.save(function(err) {
if (!err) {
///!!!!!!!!!!!!!!Will come this
console.log("documents error on save!");
} else {
console.log("save documents ok!");
}
});
}
}
});
}
} else {
console.log("not find the game item!");
}
}
);
}


这是一个类似iOS game center分数排行榜的数据库, 一个游戏里有多个item项目, 每个项目有多个玩家的分数数据.
document里包含了subDoc子文档,子文档里又有一个array,怎么找到这个array里的某个值,并对它进行修改?
...全文
228 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
sb3day 2014-07-16
  • 打赏
  • 举报
回复
没办法的, NOSQL不支持
MemDB 是全球首个支持分布式事务的 MongoDB。高性能和可伸缩快速的内存数据访问,高达 25,000 ops (single doc read/write) /碎片 (each shard take one CPU core).系统可水平伸缩没有单点瓶颈真正的分布式 ACID 事务在分布式环境真正支持 ACID (Stands for Atomicity, Consistency, Isolation, Durability) 事务MemDB 让 MongoDB 支持 ACID 事务兼容 MongoDB 和 Mongoose直接使用 MongoDB 的查询 API内置 Mongoose 支持高可用性每个碎片都有一个或者多个 slaves,不会发生单点故障 MemDB shell:架构:Mdbgoose:var memdb = require('memdb-client'); var P = memdb.Promise; var mdbgoose = memdb.goose; // Define player schema var playerSchema = new mdbgoose.Schema({     _id : String,     name : String,     areaId : Number,     deviceType : Number,     deviceId : String,     items : [mdbgoose.SchemaTypes.Mixed], }, {collection : 'player'}); // Define player model var Player = mdbgoose.model('player', playerSchema); var main = P.coroutine(function*(){     // Connect to memdb     yield mdbgoose.connectAsync({         shards : { // specify all shards here             s1 : {host : '127.0.0.1', port: 31017},             s2 : {host : '127.0.0.1', port: 31018},         }     });     // Make a transaction in s1     yield mdbgoose.transactionAsync(P.coroutine(function*(){         var player = new Player({             _id : 'p1',             name: 'rain',             areaId : 1,             deviceType : 1,             deviceId : 'id1',             items : [],         });         // insert a player         yield player.saveAsync();         // find player by id         var doc = yield Player.findByIdAsync('p1');         console.log('%j', doc);         // find player by areaId, return array of players         var docs = yield Player.findAsync({areaId : 1});         console.log('%j', docs);         // find player by deviceType and deviceId         player = yield Player.findOneAsync({deviceType : 1, deviceId : 'id1'});         // update player         player.areaId = 2;         yield player.saveAsync();         // remove the player         yield player.removeAsync();     }), 's1'); }); if (require.main === module) {     main().finally(process.exit); } 标签:MemDB

87,996

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧