mongoose 嵌套查找匹配问题
先上 格式
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-23T02:30:24.837Z"),
"thing" : "play",
"money" : 10,
"_id" : ObjectId("58e086623bbf960351ac71e2")
},
{
"status" : 1,
"date" : ISODate("2017-03-24T02:30:24.837Z"),
"thing" : "sleep",
"money" : 20,
"_id" : ObjectId("58e086623bbf960351ac71e1")
},
{
"status" : 1,
"date" : ISODate("2017-03-25T02:30:24.837Z"),
"thing" : "play",
"money" : 10,
"_id" : ObjectId("58e086623bbf960351ac71e0")
},
{
"status" : 2,
"date" : ISODate("2017-03-23T02:30:24.837Z"),
"thing" : "play",
"money" : 10,
"_id" : ObjectId("58e086623bbf960351ac71df")
},
{
"status" : 2,
"date" : ISODate("2017-03-24T02:30:24.837Z"),
"thing" : "sleep",
"money" : 20,
"_id" : ObjectId("58e086623bbf960351ac71de")
},
{
"status" : 2,
"date" : ISODate("2017-03-25T02:30:24.837Z"),
"thing" : "play",
"money" : 10,
"_id" : ObjectId("58e086623bbf960351ac71dd")
},
{
"status" : 3,
"date" : ISODate("2017-03-23T02:30:24.837Z"),
"thing" : "play",
"money" : 10,
"_id" : ObjectId("58e086623bbf960351ac71dc")
},
{
"status" : 3,
"date" : ISODate("2017-03-24T02:30:24.837Z"),
"thing" : "sleep",
"money" : 20,
"_id" : ObjectId("58e086623bbf960351ac71db")
},
{
"status" : 4,
"date" : ISODate("2017-03-25T02:30:24.837Z"),
"thing" : "play",
"money" : 10,
"_id" : ObjectId("58e086623bbf960351ac71da")
}
],
"money" : 0,
"date" : ISODate("2017-04-02T05: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。╰_╯