mongoose 嵌套查找匹配问题 - CNode技术社区

mongoose 嵌套查找匹配问题
发布于 9 年前 作者 bringtree 5336 次浏览 来自 问答

先上 格式

var UserSchema = new mongoose.Schema({
 name: {type: String, trim: true, require: true},
 username: {type: String, unique: true, require: true, trim: true},
 password: {type: String, require: true},
 admin: {type: Boolean, default: false},
 date: {type: Date, default: Date.now},
 money: {type: Number, default: 0},
 accounts: [{
 status: {type: Number, require: true},
 date: {type: Date, require: true},
 thing: {type: String, require: true},
 money: {type: Number, require: true}
 }]
})

我存储的数据:

{
 "_id" : ObjectId("58e086623bbf960351ac71d9"),
 "name" : "xiaoming",
 "username" : "xiao",
 "password" : "ming",
 "accounts" : [ 
 {
 "status" : 1,
 "date" : ISODate("2017年03月23日T02:30:24.837Z"),
 "thing" : "play",
 "money" : 10,
 "_id" : ObjectId("58e086623bbf960351ac71e2")
 }, 
 {
 "status" : 1,
 "date" : ISODate("2017年03月24日T02:30:24.837Z"),
 "thing" : "sleep",
 "money" : 20,
 "_id" : ObjectId("58e086623bbf960351ac71e1")
 }, 
 {
 "status" : 1,
 "date" : ISODate("2017年03月25日T02:30:24.837Z"),
 "thing" : "play",
 "money" : 10,
 "_id" : ObjectId("58e086623bbf960351ac71e0")
 }, 
 {
 "status" : 2,
 "date" : ISODate("2017年03月23日T02:30:24.837Z"),
 "thing" : "play",
 "money" : 10,
 "_id" : ObjectId("58e086623bbf960351ac71df")
 }, 
 {
 "status" : 2,
 "date" : ISODate("2017年03月24日T02:30:24.837Z"),
 "thing" : "sleep",
 "money" : 20,
 "_id" : ObjectId("58e086623bbf960351ac71de")
 }, 
 {
 "status" : 2,
 "date" : ISODate("2017年03月25日T02:30:24.837Z"),
 "thing" : "play",
 "money" : 10,
 "_id" : ObjectId("58e086623bbf960351ac71dd")
 }, 
 {
 "status" : 3,
 "date" : ISODate("2017年03月23日T02:30:24.837Z"),
 "thing" : "play",
 "money" : 10,
 "_id" : ObjectId("58e086623bbf960351ac71dc")
 }, 
 {
 "status" : 3,
 "date" : ISODate("2017年03月24日T02:30:24.837Z"),
 "thing" : "sleep",
 "money" : 20,
 "_id" : ObjectId("58e086623bbf960351ac71db")
 }, 
 {
 "status" : 4,
 "date" : ISODate("2017年03月25日T02:30:24.837Z"),
 "thing" : "play",
 "money" : 10,
 "_id" : ObjectId("58e086623bbf960351ac71da")
 }
 ],
 "money" : 0,
 "date" : ISODate("2017年04月02日T05:04:34.550Z"),
 "admin" : false,
 "__v" : 0
}

重点 重点 我查询的语句

 // var b =await UserModel.aggregate().unwind('accounts').exec() //这条是正常
 // var b = await UserModel.aggregate().unwind('accounts').match({'accounts.status':'1'}).exec(); //这条匹配到是空的

我要实现的是 查询到accounts.status =1 的所有 子_id 理想是这样子的

 // UserModel.aggregate().unwind('accounts').match({'accounts.status':'1'}).sort({'accounts.money':1}).skip(0).limit(10).group({_id:"$_id",accounts:{$push:"$accounts"}}).exec()
11 回复

我最后 全部数据取下来 再处理。。。。。 希望求教match 使用 ,官网那个match文档 好像也写错了 括号都没匹配好。

还没用过unwind,不过你match里面 accounts.status 感觉不太对。accounts本身是数组,应该是数组中的元素才有status的

你先不要匹配,看一下unwind后的结果

@ilaipi @qujinxiong 把match去掉就正常了 出现match 就什么也没了

去掉后的结果发出来看看

@qujinxiong 结果就是匹配到全部 。一个都没有拉下 加上就是[]

我代码已经丢失了 ,之后处理是全部取下来 然后 再做处理的

@ilaipi 我是参照http://www.cnblogs.com/TheViper/p/4317660.html他的写法的 虽然我也觉得怪怪的

@ilaipi 他那个comments 的查找 comments是个数组 然后。。。

 themeModel.aggregate()
 .project('posts.comments theme_name posts.title posts.post_id')
 .unwind('posts')
 .unwind('posts.comments')
 .match({'posts.comments.to':modelBase._mongoose.Types.ObjectId(user)})
 .sort({"posts.comments.time":-1})
 .exec().then(function(theme){
 fn(null,theme);
 });
 };
 };

越用这个库越用越不爽,好恨自己不行,不能写一个mongoose。╰_╯

回到顶部

AltStyle によって変換されたページ (->オリジナル) /