【问题标题】:Mongodb subfield selectMongodb子字段选择
【发布时间】:2013-08-19 16:53:03
【问题描述】:

您好,我有以下数据库:

我的问题是如何“从帖子中选择名称,其中线程=斯隆”

因为我正在尝试进入 RockMongo shell:"db.users.find({"posts.thread":'Sloan'})" 但它返回了所有收集数据

***** 使用 json-generator.com ********************

[
            '{{repeat(5, 7)}}',
            {
                id: '{{index}}',
                group: '{{surname}}',
                name: '{{firstName}} {{surname}}',

                posts: [
                    '{{repeat(25)}}',
                    {
                        thread:'{{surname}}',
                        sb:[
                            '{{repeat(100)}}',
                            {
                                id: '{{index}}',
                                name: '{{firstName}} {{surname}}'

                            }
                        ]
                    }
                ],

                users:[
                    '{{repeat(25)}}',
                    {
                        name:'{{firstName}}'
                    }]


            }
        ]

【问题讨论】:

  • 你能发布包含帖子和线程的文档的示例结构吗?
  • 我不知道出了什么问题。您的“SQL”之类的请求与您的分层数据结构不匹配。你能发布你想要的结果吗?
  • 需要获取 sb 数组 where thread = some name

标签: node.js mongodb nosql


【解决方案1】:

为了澄清一点... 如果您有一个如下所示的数据库:

如果你这样做db.users.find({ posts: { $elemMatch: { thread: "Sloan" } } }), 你会得到这个(包括每个元素的帖子):

如果你这样做db.users.find({"posts.thread":'Sloan'},{'posts.$':1}), 您将获得此(仅包括相关帖子):

(顺便说一句,执行起来更快……如果你在posts.thread上添加索引,它会更快。)

最后一件事,我认为这里可能会产生误导。 db.users.find({ posts: { $elemMatch: { thread: "Sloan" } } }, { name: 1 }) 投影将给出元素名称“gloria sharpe”,但根据我从问题中了解到的情况,他更愿意获得post.thread.sb.name 的名称。这就是为什么他只想将相关帖子作为答案,而不是该元素的所有帖子。

【讨论】:

    【解决方案2】:

    我不确定您是否可以直接检索名称,但您肯定可以通过投影检索您要查找的帖子:

    db.users.find({"posts.thread":'Sloan'},{'posts.$':1})

    如果您想了解更多关于 $ 投影运算符的说明,请看这里: MongoDB doc

    不幸的是,我认为您不能这样做{'posts.$.name':1},因此您必须在结果回调中提取名称。 (取决于您要检索的名称字段...请参阅我的其他答案)

    【讨论】:

      【解决方案3】:

      您可以使用以下 $elemMatch 运算符来获取您需要的内容:

      db.users.find({ posts: { $elemMatch: { thread: "Sloan" } } }, { name: 1 })
      

      【讨论】:

      • 返回与 db.users.find() 相同的数据
      • 再试一次,绝对正确。见gist.github.com/cheald/6291848
      • 不,它没有。在您的情况下,存储的对象是数组,因此 elemMatch 仅返回包含您要查找的内容的数组的帖子。在他的例子中,存储的对象包含多个数组,他试图找到包含他的值的那个。 elemMatch 将返回包含多个数组的整个对象,因为其中一个包含他正在寻找的值。
      • 只选择他感兴趣的位很容易使用 find() 的第二个参数完成;从讨论看来,他的问题首先在于获得正确的记录。也许我误解了。
      【解决方案4】:
      db.users.aggregate(
          { $unwind:'$posts' }, 
          {$match: {'posts.thread': 'Sloan'} },
          {$group:{_id:'$name', posts:{$push:'$posts'} }});
      

      向cmets的this link学习,我按照@Stennie的回答,给出了答案,我认为是正确的。

      $unwindcut 数组到独立的文档,$group 再次将它们变成一个数组。

      【讨论】:

      【解决方案5】:

      您可以使用$unwind 聚合运算符如下使平面JSON 文档在$match 上工作以检查每个项目的线程(即posts.thread):

      var name_to_match = 'Sloan';
      db.users.aggregate(
          {$unwind:'$posts'}, 
          {$match: {'posts.thread': name_to_match} },
          {$group:{_id:'$name', name: {$first:'$posts.thread'} }}
      );
      

      现在,结果输出包含如下内容:

      {
         _id: '{{firstName}} {{surname}}',
         name: '{{surname}}'
      }
      

      愉快地探索 MongoDB :)

      【讨论】:

        【解决方案6】:

        在 java 中你可以像这样从 mongodb 中获取值:

        MongoClient mongo=new MongoClient("localhost",27017);
        DB db = mongo.getDB("webportal");
        DBCollection coll=db.getCollection("userdb");
        String useremail=session("user");
        BasicDBObject doc1=new BasicDBObject("email",useremail);
        DBCursor cours=coll.find(doc1);
        if(cours.hasNext())
        {
            Map userjasondata=cours.next().toMap();
            String userid=userjasondata.get("_id").toString();
            session("userid",userid);
            String username=userjasondata.get("username").toString();
            String password=userjasondata.get("password").toString();
            String useremail1=userjasondata.get("email").toString();
            return ok(userprofile.render(username, username, password, useremail1)); 
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-09-25
          • 1970-01-01
          • 1970-01-01
          • 2011-06-21
          • 2014-11-15
          • 2020-09-16
          • 1970-01-01
          相关资源
          最近更新 更多