mongoose内嵌文档数量或直接获取

539 阅读1分钟
原文链接: segmentfault.com
{
    "_id" : ObjectId("59e05fa63e0f5015dcaeadbe"),
    "name" : "santu",
    "mes" : "测试留言1",
    "time" : ISODate("2017-10-13T06:39:34.273Z"),
    "replay" : [ 
        {
            "time" : ISODate("2017-10-13T06:39:55.365Z"),
            "_id" : ObjectId("59e05fbb3e0f5015dcaeadbf"),
            "replayer" : "santu",
            "replaymes" : "测试留言回复1"
        }
    ],
    "__v" : 0
}

数据结构是这样的,想要获取'replay',下的内嵌文档个数或者所有的内容

db.mesModel.aggregate([
 {$project: {num: {$size: '$replay'}}}
])

这样的查询语打印的结果是

[ { _id: 59e05fa63e0f5015dcaeadbe, replay: 1 },
  { _id: 59e063d85f465906606add9a, replay: 1 },
  { _id: 59e063da5f465906606add9b, replay: 1 },
  { _id: 59e063dd5f465906606add9c, replay: 1 } ]

就打印出了我所有每个父级数据的子数据个数

中文文档不是很齐。。。英文的看着有点压力

具体实现目标获取上列数据中的所有"replaymes"
我在想是否有一个api能直接获取
我自己的实现方式是 找到内嵌数据数量,遍历

db.mesModel.findOne({mes:'xxx'},(err,doc)=>{
    var len = doc.replay.length
    for(let i=0;i<len;i++){
        console.log(doc.replay[i].replaymes)//打印出来了
    }
})

内嵌的文档的精确多条件查询,实现目标是已知replay下的 replaymes和time 查找符合条件的 replay

db.mesModel.aggregate(
    {"$project":{"replay":"$replay"}},
    {"$unwind":"$replay"},
    {"$match":{"replay.replaymes":'xxx','replay.time':'xxx'}}
,function(err,doc){
  console.log(doc)
})

如果用time做条件会匹配不到 但是如果用replay.replayer 做条件 能匹配到