Node.js Mongodb子字段选择
您好,我有以下数据库: 我的问题是如何“从thread=Sloan的帖子中选择姓名” 因为我正在尝试RockMongo shell:“db.users.find({“posts.thread”:'Sloan'})”但它返回所有收集数据 *****使用json-generator.com********************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}}',
[
'{{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
(不带引号)