mongodb 查询返回 value 而不是返回 key:value - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
anthoy
V2EX    MongoDB

mongodb 查询返回 value 而不是返回 key:value

  •  
  •   anthoy 2021-04-15 18:10:48 +08:00 2630 次点击
    这是一个创建于 1638 天前的主题,其中的信息可能已经有所发展或是发生改变。

    问一下,mongodb 支持只返回 value,而不是返回 key:value 这样子格式的吗?

    比如下面的表

    > db.user.find() { "_id" : ObjectId("6077fac5fe214ec7b60ea68e"), "name" : "chenyurong", "age" : 25, "addr" : "ShenZhen" } { "_id" : ObjectId("60780dbdfe214ec7b60ea68f"), "name" : "chenyurong", "age" : 26, "addr" : "ShenZhen" } { "_id" : ObjectId("60780dc0fe214ec7b60ea690"), "name" : "chenyurong", "age" : 27, "addr" : "ShenZhen" } { "_id" : ObjectId("60780dc3fe214ec7b60ea691"), "name" : "chenyurong", "age" : 28, "addr" : "ShenZhen" } { "_id" : ObjectId("60780e39fe214ec7b60ea692"), "name" : "test", "age" : 20, "addr" : "ShenZhen" } 
    • 进行查询 age,获取 age 的值
    > db.user.find({"name":"test"},{"age":1}) { "_id" : ObjectId("60780e39fe214ec7b60ea692"), "age" : 20 } 

    但我希望返回的直接是20,这个 mongodb 支持的嘛?

    目前我查阅的资料都是不支持的,有没有人有其他的操作

    • 查询 age 列表
    > db.user.find({},{"age":1}) { "_id" : ObjectId("6077fac5fe214ec7b60ea68e"), "age" : 25 } { "_id" : ObjectId("60780dbdfe214ec7b60ea68f"), "age" : 26 } { "_id" : ObjectId("60780dc0fe214ec7b60ea690"), "age" : 27 } { "_id" : ObjectId("60780dc3fe214ec7b60ea691"), "age" : 28 } { "_id" : ObjectId("60780e39fe214ec7b60ea692"), "age" : 20 } 

    我希望可以返回的是关于 age 的列表,比如{ age:[25,26,...] } 或者直接是[25,26,...]

    这个可以实现嘛?还是只能从上面的结果进行处理生成数组

    • spring-boot-starter-data-mongodb

    目前我使用 spring-boot-starter-data-mongodb 操作 mongodb 的,主要使用 MongoTemplate

    我想了解下 MongoTemplate 有没有对其封装有实现上面两个需求的,目前我看文档也是没有找到

    没有的话是不是只能查询出 List<User>,再编历读取构建 age 的数组了

    有相关使用或者资料的小伙伴麻烦提供下你的建议!!谢谢!

    11 条回复    2021-04-16 08:53:17 +08:00
    xkeyideal
        1
    xkeyideal  
       2021-04-15 18:22:02 +08:00
    学艺不精,mongodb 取哪个字段是{"age":1},那么有没有反问过,不取哪个字段应该怎么写呢?
    答案:db.user.find({"name":"test"},{"age":1,"_id":0})
    est
        2
    est  
       2021-04-15 18:25:26 +08:00
    估计是不行的。还是得在代码里自己拼接。

    你实在要 mongo 自己吐格式,可以用 aggregate
    anthoy
        3
    anthoy  
    OP
       2021-04-15 18:29:04 +08:00
    @xkeyideal 嗯嗯,是的,但我想的是单纯返回最后的值,不包括 key
    xkeyideal
        4
    xkeyideal  
       2021-04-15 18:36:26 +08:00
    @anthoy 说点啥好呢,不懂就问固然挺好,但基本常识还是要懂的吧
    anthoy
        5
    anthoy  
    OP
       2021-04-15 18:43:37 +08:00
    @xkeyideal
    > db.user.find({"name":"test"},{"age":1,"_id":0})

    { "age" : 20 }

    但我想的是只返回 20,而不是{ "age" : 20 }

    感觉我们之间有点不在同一条频道上呀,或者你想说的是别的?
    DGideas
        6
    DGideas  
       2021-04-15 21:55:05 +08:00
    https://stackoverflow.com/questions/35434911/pymongo-find-only-return-answer

    最方便的方法好像就是在 List Comprehension 里用 ["key"] 来取 value 了
    DGideas
        7
    DGideas  
       2021-04-15 21:56:23 +08:00
    不过话说回来啊,这种数据库查询一般都会返回一个结果集,都得需要自己从中取数据的啊,一个结果集就是一条(包含一个或多个字段的)字典数据结构嘛
    zengming00
        8
    zengming00  
       2021-04-15 22:21:38 +08:00
    db.user.find({"name":"test"},{"age":1,"_id":0}).age
    maocat
        9
    maocat  
       2021-04-15 23:56:07 +08:00
    db.user.distinct("age", {"name":"test"})
    maocat
        10
    maocat  
       2021-04-16 00:16:18 +08:00   1
    db.user.find({"name":"test"}).map( function (item){ return item.age} )
    listenerri
        11
    listenerri  
       2021-04-16 08:53:17 +08:00
    @zengming00 #8 @maocat 请问像这种链调的风格,不怕 `find` 找不到结果返回空值吗?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5829 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 02:24 PVG 10:24 LAX 19:24 JFK 22:24
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86