2

私たちは Java サーバーと Mongo DB [プレーンな Java-Mongo であり、Morphia や CRUD 用のツールではありません] を使用しています。
以下のような Image Pojo クラスとそれに関連するメタデータがあります。

public class Img{
    private String name;
    private List<Metadata> imgMetaList = new ArrayList<Metadata>();

    //Getters, setters etc...
    public List<Metadata> getImgMetaList() {        
        return imgMetaList;
    }
}

メタデータ クラスにデータがあり、Serializable の実装がうまくいかなかったので、
ReflectionDBObject を拡張しました。

public class Metadata extends ReflectionDBObject{
    private String tag;
    private String val;

    //Getters, setters etc...      
}

Img を Mongo に保存したい。次のコードを使用しましたが、うまくいきました。

BasicDBObject updateQuery = new BasicDBObject();
updateQuery.put("name", img.getName());
BasicDBObject updMetadata = new BasicDBObject();
updMetadata.put("$push", new BasicDBObject("imgMetaList",img.getImgMetaList()) );
collection.update(updateQuery,updMetadata, true, false);    

これにより、以下のように Mongo にドキュメントが挿入されます。

{
    "_id" : ObjectId("503a1991db2e9f431cf0d162"),
    "name" : "test.jpg",
    "imgMetaList" : [
        [
            {
                    "Tag" : "tag1",
                    "Val" : "val1",
                    "_id" : null
            }
        ]
    ]
}

ここには 2 つ
の問題があります。1. コードは、配列を格納するために 1 つではなく 2 つの角かっこを挿入しています
。2. リストに対して _id が生成されないのはなぜですか。

私にお知らせください。
よろしく、ヴィッシュ

4

1 に答える 1

1

$push は配列に値を追加します。配列がまだ存在しない場合は、新しい配列が作成されます。プッシュしているアイテムは配列であるため、配列内の配列になります。

これは MongoDB の通常の動作であるため、コレクションに対して _id は生成されません。サブドキュメントをドキュメントに配置すると、サブドキュメントは _id を取得しません。したがって、配列には _id がありません。

おそらく代わりに、配列内のメタデータ ドキュメントに null _id がある理由を尋ねているのでしょう。これは ReflectionDBObject クラスの動作です。これには _id フィールドが含まれていますが、その値を設定するのはユーザー次第です。ReflectionDBObject インスタンスで set_id() を呼び出すことにより、この _id を null 以外の値に設定できます。これを行うのに適した場所は、Metadata クラスのコンストラクターです。_id を生成するには、ObjectId.get() 静的メソッド (org.bson.types.ObjectId) を使用します。

MongoDB に画像を挿入するためのコードは、必要以上に複雑です。以下は機能します (ネストされた配列を取り除きます):

BasicDBObject imageDoc = new BasicDBObject();
imageDoc("name", img.getName());
imageDoc("imgMetaList", img.getImgMetaList());
collection.insert(imageDoc);
于 2012-08-27T06:38:03.510 に答える