是否可以使用ONLY Array([x] [y [x] [z]])方法查询MongoDB?不了解Elements的内容?

时间:2013-04-10 05:43:42

标签: mongodb

这是7个测试/示例文档中的第一个,收集在“SoManySins”中。

{
  "_id" : ObjectId("51671bb6a6a02d7812000018"),
  "Treats" : "Sin1 = Gluttony",
  "Sin1" : "Gluttony",
  "Favourited" : "YES",
  "RecentActivity" : "YES",
  "GoAgain?" : "YeaSure."
}

我希望能够查询以检索任何位置的任何信息, 只是通过提到这个位置。以下文件

{
   "_id" : ObjectId("51671bb6a6a02d7812000018"),
   "Sin1" : "Gluttony",
   "?????????" : "??????",
   "RecentActivity" : "YES",
   "GoAgain?" : "YeaSure."
} 

可以检索第3个键值中的任何内容 对。为什么要提前知道什么是 数据是关键?如果一个具有相同的结构 收藏,谁需要知道?这样,你就可以得到 效率翻倍?就像有很多邮箱一样 并且您的应用用户提供密钥和价值;你的应用 只查询dbs'文档'数组的位置。 克拉拉?最后?我希望?

2 个答案:

答案 0 :(得分:0)

您提供的示例文档未保存为BSON中的数组:

{
    "_id" : ObjectId("51671bb6a6a02d7812000018"),
    "Sin1" : "Gluttony",
    "?????????" : "??????",
    "RecentActivity" : "YES",
    "GoAgain?" : "YeaSure."
}

根据您使用的MongoDB驱动程序,此处的字段通常在应用程序代码中表示为关联数组或散列。这些数据结构不是保持顺序的,因此您不能假定给定文档中的第3个字段将对应于另一个文档中的相同字段(或者甚至相同的字段顺序将在多个提取中保持一致)。您需要按名称引用该字段。

如果您为字段使用数组,则可以按位置引用或使用$slice projection选择数组的子集。

包含字段数组的示例文档:

{
    "_id" : ObjectId("51671bb6a6a02d7812000018"),
    "fields": [
        { "Sin1" : "Gluttony" },
        { "?????????" : "??????" },
        { "RecentActivity" : "YES" },
        { "GoAgain?" : "YeaSure." }
    ]
}

..并查询以查找fields数组的第二个元素(a $slice,跳过1,限制1):

db.SoManySins.find({}, { fields: { $slice: [1,1]} })
{
    "_id" : ObjectId("51671bb6a6a02d7812000018"),
    "fields" : [
        {
            "?????????" : "??????"
        }
    ]
}

答案 1 :(得分:0)


这是查询和获取数据的一种方法 知道数据是什么,但你知道数据的结构: Mongo Shell和PHP中的示例

//基础知识,设置:

 $dbhost = 'localhost'; $dbname = 'test';
 $m = new Mongo("mongodb://$dbhost");
 $db = $m->$dbname;
 $CursorFerWrites = $db->NEWthang; 

//定义一组数据,用PHP创建文档:

 $TheFieldGenerator = array( 'FieldxExp' => array(
 array('Doc1 K1'=>'Val A1','Doc1 K2'=>'ValA2','Doc1 K3'=>'Val A3'),
 array('Doc2 K1'=>'V1','Doc2 K2'=>'V2','Doc2 K3'=>'V3' ) ) ) ; 

//然后将其写入MongoDB:

 $CursorFerWrites->save($TheFieldGenerator); 

注意:在Shell中:这会产生相同的文档:

 > db.NEWthang.insert({"FieldxExp" : [
       {"Doc1 K1":"Val A1","Doc1 K2":"Val A2","Doc1 K3":"Val A3"},
       {"Doc2 K1":"V1", "Doc2 K2":"V2","Doc2 K3":"V3"}
                                                                      ]
                                           }) 


现在,有些mongodb Shell语法:

 > db.NEWthang.find().pretty()
    {
         "_id" : ObjectId("516c4053baa133464d36e836"),
         "FieldxExp" : [
            {
                    "Doc1 K1" : "Val A1",
                    "Doc1 K2" : "Val A2",
                    "Doc1 K3" : "Val A3"
            },
            {
                    "Doc2 K1" : "V1",
                    "Doc2 K2" : "V2",
                    "Doc2 K3" : "V3"
            }
    ]
 }
 > db.NEWthang.find({}, { "FieldxExp" : { $slice: [1,1]} } ).pretty()
 {
    "_id" : ObjectId("516c4053baa133464d36e836"),
    "FieldxExp" : [
            {
                    "Doc2 K1" : "V1",
                    "Doc2 K2" : "V2",
                    "Doc2 K3" : "V3"
            }
    ]
 }

 > db.NEWthang.find({}, { "FieldxExp" : { $slice: [0,1]} } ).pretty()
   {
    "_id" : ObjectId("516c4053baa133464d36e836"),
    "FieldxExp" : [
            {
                    "Doc1 K1" : "Val A1",
                    "Doc1 K2" : "Val A2",
                    "Doc1 K3" : "Val A3"
            }
      ]
 } 

最后,如何在一些PHP ::

中编写Query

//这些将用于构建MongoCursor:

 $myEmptyArray = array();
 $TheProjectionCriteria = array('FieldxExp'=> array('$slice' => array(1,1))); 

//在这里设置:

 $CursorNEWthang1 = new MongoCollection($db, 'NEWthang'); 

//现在准备进行查询/阅读:

 $ReadomgomgPls=$CursorNEWthang1->find($myEmptyArray,$TheProjectionCriteria); 

并打印出第二份文件:

 foreach ($ReadomgomgPls as $somekey=>$AxMongoDBxDocFromCollection) {
var_dump($AxMongoDBxDocFromCollection);echo '<br />';
 }

希望这对一些人有用。