Mongodb子字段选择

时间:2013-08-17 10:12:07

标签: node.js mongodb nosql

您好我有以下数据库:

a busy cat

我的问题是我如何“选择姓名来自帖子哪里线程=斯隆”

因为我正在尝试使用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}}'
                    }]


            }
        ]

6 个答案:

答案 0 :(得分:2)

澄清一点...... 如果您的数据库看起来像这样:

enter image description here

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

enter image description here

如果你做db.users.find({"posts.thread":'Sloan'},{'posts.$':1}), 你会得到这个(只包括相关的帖子):

enter image description here

(顺便说一下,它的执行速度更快......如果你在posts.thread上添加索引,它会更快。)

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

答案 1 :(得分:1)

您可以使用$ elemMatch运算符来获得所需内容:

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

答案 2 :(得分:1)

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

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

如果您想了解有关$投影运算符的更多说明,请查看此处: MongoDB doc

不幸的是,我认为你不能{'posts.$.name':1},所以你必须在生成的回调中提取名称。 (取决于您要检索的名称字段...请参阅我的其他答案)

答案 3 :(得分:0)

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

this link主题评论中学习,我按照@Stennie的回答,给出了答案,我认为这是正确的。

$unwind将数组剪切为独立文档,$group再次将它们转换为数组。

答案 4 :(得分:0)

您可以使用$unwind聚合运算符,如下所示,使$match上的平面JSON文档可用于检查每个项目的线程(即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:)

答案 5 :(得分:0)

在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)); 
}