Mongodb 缩小mongo db查询结果的范围

Mongodb 缩小mongo db查询结果的范围,mongodb,nosql,Mongodb,Nosql,所以我有一个Mongo查询: {"r_rid" : "cr_448630" } 当我执行find()时返回 如果我只想获得索引为33455的用户,该怎么办 如何修改我的mongo查询 抱歉,这里是mongo n00b…您可以通过第二个(投影)参数指定要包含在结果中的文档的哪些部分: db.test.find({“r_-rid”:“cr_448630”},{'users.33455':1}) 返回: { "_id": ObjectId("5202d6a2d3e4ab0f04cca6c2"

所以我有一个Mongo查询:

{"r_rid" : "cr_448630" } 
当我执行find()时返回

如果我只想获得索引为33455的用户,该怎么办

如何修改我的mongo查询


抱歉,这里是mongo n00b…

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

db.test.find({“r_-rid”:“cr_448630”},{'users.33455':1})
返回:

{
  "_id": ObjectId("5202d6a2d3e4ab0f04cca6c2"),
  "users": {
    "33455": {
      "duration": 1563835,
      "last_ts": 1375826968
    }
  }
}
{
“_id”:ObjectId(“5202d6a2d3e4ab0f04cca6c2”),
“用户”:{
"33455": {
“期限”:1563835,
"最后":1375826968
}
}
}

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

db.test.find({“r_-rid”:“cr_448630”},{'users.33455':1})
返回:

{
  "_id": ObjectId("5202d6a2d3e4ab0f04cca6c2"),
  "users": {
    "33455": {
      "duration": 1563835,
      "last_ts": 1375826968
    }
  }
}
{
“_id”:ObjectId(“5202d6a2d3e4ab0f04cca6c2”),
“用户”:{
"33455": {
“期限”:1563835,
"最后":1375826968
}
}
}

我这里没有什么评论,一般来说,您不能仅仅从文档中获取子文档,因为它是唯一的返回值。作为JohnnyHK writesis,您可以直接从MongoDB获得最佳体验:

返回:

{
  "_id": ObjectId("5202d6a2d3e4ab0f04cca6c2"),
  "users": {
    "33455": {
      "duration": 1563835,
      "last_ts": 1375826968
    }
  }
}
但是,我必须对您的模式发表一些评论。作为指导原则,您不应该将值作为键。用户ID
“33455”
实际上不是一个键,因为您无法预先定义您将拥有多少,它们基本上是随机名称。例如,仅针对用户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\u rid
复制到每个用户文档中。此模式为您提供了更简单的查询,您现在还可以使用索引来查询具有
用户id的
r\u rid
,同时:

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

我这里没有什么评论,一般来说,您不能仅仅从文档中获取子文档,因为它是唯一的返回值。作为JohnnyHK writesis,您可以直接从MongoDB获得最佳体验:

返回:

{
  "_id": ObjectId("5202d6a2d3e4ab0f04cca6c2"),
  "users": {
    "33455": {
      "duration": 1563835,
      "last_ts": 1375826968
    }
  }
}
但是,我必须对您的模式发表一些评论。作为指导原则,您不应该将值作为键。用户ID
“33455”
实际上不是一个键,因为您无法预先定义您将拥有多少,它们基本上是随机名称。例如,仅针对用户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\u rid
复制到每个用户文档中。此模式为您提供了更简单的查询,您现在还可以使用索引来查询具有
用户id的
r\u rid
,同时:

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