V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐工具
RoboMongo
推荐书目
50 Tips and Tricks for MongoDB Developers
Related Blogs
Snail in a Turtleneck
anthoy
V2EX  ›  MongoDB

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

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

    问一下,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   ·   实用小工具   ·   3286 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 11:37 · PVG 19:37 · LAX 03:37 · JFK 06:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.