开发者社区> 问答> 正文

mongodb 内嵌数组查询问题: 如何限定返回与条件匹配的数组

screenshot
原数据为:

{
    "_id" : NumberLong(1181675746),
    "shard_qty" : 4,
    "goods_qty" : 0,
    "shop_qty" : 0,
    "favorite_qty" : 4,
    "favorite_shards" : [ 
      {
            "sid" : NumberLong(580),
            "favorite_dt" : ISODate("2015-06-26T12:13:06.405+08:00"),
            "is_attention" : true
        }, 
      {
            "sid" : NumberLong(579),
            "favorite_dt" : ISODate("2015-06-26T12:13:06.405+08:00"),
            "is_attention" : true
        }, 
        {
            "sid" : NumberLong(578),
            "favorite_dt" : ISODate("2015-06-26T12:13:06.405+08:00"),
            "is_attention" : true
        }, 
        {
            "sid" : NumberLong(577),
            "favorite_dt" : ISODate("2015-06-26T13:20:48.449+08:00"),
            "is_attention" : true
        }
    ]
}

查询条件为

db.getCollection('web_mem_favorites').findOne(
    {
    '_id':NumberLong(1181675746),
    'favorite_shards.sid': {
        '$in':[NumberLong(577),NumberLong(578)]
        }
    }
    ,{"favorite_shards":1}
)

想返回的数据:

{
    "_id" : NumberLong(1181675746),
    "favorite_shards" : [ 
      {
            "sid" : NumberLong(578),
            "favorite_dt" : ISODate("2015-06-26T12:13:06.405+08:00"),
            "is_attention" : true
        }, 
        {
            "sid" : NumberLong(577),
            "favorite_dt" : ISODate("2015-06-26T13:20:48.449+08:00"),
            "is_attention" : true
        }
    ]
}

展开
收起
蛮大人123 2016-06-14 16:12:44 3003 0
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪
    {
    
    "_id" : NumberLong(1181675746),
    "shard_qty" : 4,
    "goods_qty" : 0,
    "shop_qty" : 0,
    "favorite_qty" : 4,
    "favorite_shards" : [
        {
            "sid" : NumberLong(580),
            "favorite_dt" : ISODate("2015-06-26T04:13:06.405Z"),
            "is_attention" : true
        },
        {
            "sid" : NumberLong(579),
            "favorite_dt" : ISODate("2015-06-26T04:13:06.405Z"),
            "is_attention" : true
        },
        {
            "sid" : NumberLong(578),
            "favorite_dt" : ISODate("2015-06-26T04:13:06.405Z"),
            "is_attention" : true
        },
        {
            "sid" : NumberLong(577),
            "favorite_dt" : ISODate("2015-06-26T05:20:48.449Z"),
            "is_attention" : true
        }
    ]
    }
    
    db.test3.aggregate([
    
    ... {"$match":{"_id":NumberLong(1181675746)}},
    ... {"$project":{"_id":1,"favorite_shards":1}},
    ... {"$unwind": "$favorite_shards"},
    ... {$match: {"favorite_shards.sid": {'$in':[NumberLong(577),NumberLong(578)]}}},
    ... {"$group": {"_id": "$_id", "favorite_shards": {"$push": "$favorite_shards"}}}
    ... ]).pretty()
    {
    
    "_id" : NumberLong(1181675746),
    "favorite_shards" : [
        {
            "sid" : NumberLong(578),
            "favorite_dt" : ISODate("2015-06-26T04:13:06.405Z"),
            "is_attention" : true
        },
        {
            "sid" : NumberLong(577),
            "favorite_dt" : ISODate("2015-06-26T05:20:48.449Z"),
            "is_attention" : true
        }
    ]
    }

    实现的逻辑就是将原来的数组拆开,然后重组就好了。

    2019-07-17 19:38:00
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
开源数据库 MongoDB 专场 MongoDB疑难杂症分析及优化 立即下载
阿里云MongoDB云服务构建 立即下载
饿了么高级架构师陈东明:MongoDB是如何逐步提高可靠性的 立即下载