0

所以我有这个 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...

4

2 回答 2

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" , 
}

正如你所看到的,我现在已经复制mgr_rid每个用户文档中。此模式为您提供了更轻松的查询,并且您现在可以使用索引同时查询 ar_rid和 a user_id

db.test.ensureIndex( { r_rid: 1, userid: 1 } );
db.test.find( { 'r_rid': "cr_448630", 'userid' : 33455 } );
于 2013-08-08T09:23:07.637 回答
0

您可以通过第二个(投影)参数指定要包含在结果中的文档的哪些部分find

db.test.find({"r_rid" : "cr_448630"}, {'users.33455': 1})

回报:

{
  "_id": ObjectId("5202d6a2d3e4ab0f04cca6c2"),
  "users": {
    "33455": {
      "duration": 1563835,
      "last_ts": 1375826968
    }
  }
}
于 2013-08-07T23:27:26.993 回答