0

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

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

我希望能够通过引用该位置来查询以检索任何位置的任何信息。以下文件,

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

可以检索第三个键值对中可能存在的任何内容。为什么必须提前知道密钥中的数据是什么?如果一个集合的结构相同,谁需要知道?这样一来,你能获得双倍的效率吗?就像拥有大量邮箱一样,您的应用程序的用户提供密钥和价值;您的应用程序只是查询 dbs 文档的数组位置。克拉拉?最后?我希望?

4

2 回答 2

0

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

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

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

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

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

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

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

db.SoManySins.find({}, { fields: { $slice: [1,1]} })
{
    "_id" : ObjectId("51671bb6a6a02d7812000018"),
    "fields" : [
        {
            "?????????" : "??????"
        }
    ]
}
于 2013-04-15T01:02:03.727 回答
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 中编写查询 ::

// 这些将用于构建 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 />';
 }

希望这对一些人有所帮助。

于 2013-04-16T06:00:38.427 回答