3

您好,我有以下数据库:

一只忙碌的猫

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

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


            }
        ]
4

6 回答 6

2

为了澄清一点......如果你有一个看起来像这样的数据库:

在此处输入图像描述

然后,如果您这样做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。这就是为什么他只想将相关帖子作为答案,而不是该元素的所有帖子。

于 2013-08-21T11:26:10.833 回答
1

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

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

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

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

于 2013-08-19T12:27:50.877 回答
0
db.users.aggregate(
    { $unwind:'$posts' }, 
    {$match: {'posts.thread': 'Sloan'} },
    {$group:{_id:'$name', posts:{$push:'$posts'} }});

从主题评论的这个链接中学习,我遵循了@Stennie的答案,并给出了答案,我认为这是正确的。

$unwind将数组剪切为独立的文档并$group再次将它们制作成一个数组。

于 2013-08-17T10:35:21.860 回答
0

您可以按如下方式使用 $elemMatch 运算符来获得所需的内容:

db.users.find({ posts: { $elemMatch: { thread: "Sloan" } } }, { name: 1 })
于 2013-08-17T16:15:18.847 回答
0

您可以使用$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 :)

于 2013-08-21T08:30:54.423 回答
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)); 
}
于 2013-08-23T10:35:50.017 回答