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

先上 格式

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。╰_╯

回到顶部