所以我有这个Mongo查询:
{"r_rid" : "cr_448630" }
当我执行find()时返回
{
"_id" : { "$oid" : "soaifusladfjlasfjdkl2222"} ,
"mg" : 1 ,
"r_rid" : "cr_448630" ,
"users" : {
"5" : { "duration" : 15305 , "last_ts" : 99999999} ,
"33455" : { "duration" : 1563835 , "last_ts" : 1375826968} ,
"33606" : { "duration" : 4230245 , "last_ts" : 1375914301} ,
"33651" : { "duration" : 0 , "last_ts" : 1373305133}
}
}
如果我只想让用户获得索引33455
,该怎么办?如何修改我的mongo查询
对不起,mongo n00b在这里......
答案 0 :(得分:4)
我这里的评论很少,一般来说,你不能只从文档中获取子文档,因为它是唯一的返回值。正如JohnnyHK写道:
,你可以直接从MongoDB中获得最好的结果db.test.find({"r_rid" : "cr_448630"}, {'users.33455': 1})
返回:
{
"_id": ObjectId("5202d6a2d3e4ab0f04cca6c2"),
"users": {
"33455": {
"duration": 1563835,
"last_ts": 1375826968
}
}
}
但是,我必须对您的架构发表一些评论。作为指导原则,您不应该将值作为关键。用户ID "33455"
实际上不是关键,因为您无法预定义您将拥有多少,并且它们基本上是随机名称。例如,仅使用user_id的索引进行查询非常困难。您现在还可以使用数值而不是字符串作为用户ID,这又具有更好的存储和索引支持。所以我的第一个建议是将其改为:
{
"_id" : { "$oid" : "soaifusladfjlasfjdkl2222"} ,
"mg" : 1 ,
"r_rid" : "cr_448630" ,
"users" : [
{ "userid" : 5, "duration" : 15305 , "last_ts" : 99999999},
{ "userid": 33455, "duration" : 1563835 , "last_ts" : 1375826968},
{ "userid": 33606, "duration" : 4230245 , "last_ts" : 1375914301},
{ "userid": 33651, "duration" : 0 , "last_ts" : 1373305133}
]
}
但是,这意味着db.test.find({"r_rid" : "cr_448630"}, {'users.33455': 1})
不再有效。
所以我的第二个建议是从上面的文档更改为多个文档,如下所示:
{
"userid" : 5, "duration" : 15305 , "last_ts" : 99999999
"mg" : 1 , "r_rid" : "cr_448630" ,
},
{
"userid": 33455, "duration" : 1563835 , "last_ts" : 1375826968
"mg" : 1 , "r_rid" : "cr_448630" ,
},
{
"userid": 33606, "duration" : 4230245 , "last_ts" : 1375914301
"mg" : 1 , "r_rid" : "cr_448630" ,
},
{
"userid": 33651, "duration" : 0 , "last_ts" : 1373305133
"mg" : 1 , "r_rid" : "cr_448630" ,
}
如您所见,我现在已将mg
和r_rid
复制到每个用户文档中。此架构为您提供了更简单的查询,您现在也可以使用索引同时查询r_rid
user_id
:
db.test.ensureIndex( { r_rid: 1, userid: 1 } );
db.test.find( { 'r_rid': "cr_448630", 'userid' : 33455 } );
答案 1 :(得分:0)
您可以通过第二个(投影)参数指定要包含在结果中的文档部分find
:
db.test.find({"r_rid" : "cr_448630"}, {'users.33455': 1})
返回:
{
"_id": ObjectId("5202d6a2d3e4ab0f04cca6c2"),
"users": {
"33455": {
"duration": 1563835,
"last_ts": 1375826968
}
}
}