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

3 番目のキーと値のペアにあるものは何でも取得できます。鍵となるデータが何であるかを前もって知る必要があるのはなぜですか? コレクションの構造が同じである場合、誰が知る必要がありますか? この方法で、2 倍の効率を得ることができますか? 大量のメールボックスがあり、アプリのユーザーがキーと値を提供するようなものです。アプリはデータベースのドキュメントの配列の位置を照会するだけです。クララ?最後に?私は願います?

4

2 に答える 2

0

これは、データが何であるかわからないが、データの構造はわかっている場合にクエリを実行してデータを取得する 1 つの方法です: 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); 

注:シェル内:これは同じドキュメントを生成します:

 > 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 シェル構文:

 > 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); 

2 番目のドキュメントが印刷されます。

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

これが何人かの人々に役立つことを願っています。

于 2013-04-16T06:00:38.427 に答える
0

提供したサンプル ドキュメントは、BSON の配列として保存されません。

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

使用している MongoDB ドライバーによって異なりますが、ここにあるフィールドは通常、アプリケーション コードで連想配列またはハッシュとして表されます。これらのデータ構造は順序を保持しないため、特定のドキュメントの 3 番目のフィールドが別のドキュメントの同じフィールドに対応するとは想定できません (または、複数のフェッチで同じフィールドの順序が一貫しているとは限りません)。フィールドを名前で参照する必要があります。

$slice代わりにフィールドに配列を使用する場合は、位置で参照するか、射影を使用して配列のサブセットを選択できます。

フィールドの配列を含むドキュメントの例:

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

.. そして、fields 配列の 2 番目の要素を検索するためのクエリ ($sliceスキップ 1、制限 1 の a):

db.SoManySins.find({}, { fields: { $slice: [1,1]} })
{
    "_id" : ObjectId("51671bb6a6a02d7812000018"),
    "fields" : [
        {
            "?????????" : "??????"
        }
    ]
}
于 2013-04-15T01:02:03.727 に答える