Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Mongodb子字段选择_Node.js_Mongodb_Nosql - Fatal编程技术网

Node.js Mongodb子字段选择

Node.js Mongodb子字段选择,node.js,mongodb,nosql,Node.js,Mongodb,Nosql,您好,我有以下数据库: 我的问题是如何“从thread=Sloan的帖子中选择姓名” 因为我正在尝试RockMongo shell:“db.users.find({“posts.thread”:'Sloan'})”但它返回所有收集数据 *****使用json-generator.com******************** [ '{{repeat(5, 7)}}', { id: '{{index}}',

您好,我有以下数据库:

我的问题是如何“从thread=Sloan的帖子中选择姓名”

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


            }
        ]
从主题评论中,我学习了@Stennie的答案,并给出了我认为正确的答案


$unwind
将数组剪切为独立的文档,并将它们重新放入数组中

您可以使用$elemMatch操作符,如下所示,以获取所需内容:

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

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

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

如果您想了解有关
$
投影运算符的更多说明,请查看以下内容:

不幸的是,我认为您无法执行
{'posts.$.name':1}
,因此必须在结果回调中提取名称。(取决于要检索的名称字段…请参见我的另一个答案)

您可以使用如下聚合运算符获取要处理的平面JSON文档,以检查每个项目的线程(即posts.thread):

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

{
   _id: '{{firstName}} {{surname}}',
   name: '{{surname}}'
}
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)); 
}

很高兴探索MongoDB:)

稍微澄清一下。。。 如果您有一个如下所示的数据库:

{
   _id: '{{firstName}} {{surname}}',
   name: '{{surname}}'
}
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)); 
}

然后,如果执行
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})
projection将给出元素名'gloria sharpe',但根据我从问题中了解到的情况,他更愿意获得名为
post.thread.sb.name
。这就是为什么他只想得到相关帖子作为答案,而不是该元素的所有帖子。

在java中,您可以像这样从mongodb获取价值:

{
   _id: '{{firstName}} {{surname}}',
   name: '{{surname}}'
}
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)); 
}

你能发布包含帖子和线程的文档的示例结构吗?我不知道哪里出了问题。类似“SQL”的请求与分层数据结构不匹配。你能发布你想要的结果吗?需要获取sb数组,其中thread=some name返回与db.users.find()相同的数据。再试一次,它绝对正确。看,不,它没有。在您的情况下,存储的对象是数组,因此elemMatch只返回包含您要查找内容的数组的帖子。在他的例子中,存储的对象包含多个数组,他试图找到包含其值的数组。elemMatch将返回包含多个数组的整个对象,因为其中一个数组包含他正在查找的值;从讨论中可以看出,他的问题首先在于获得正确的记录。也许我误解了。@thefourtheye不,你可以访问查看语法<代码>'posts.thread'这里可以写为
posts.thread
(不带引号)