0

Mongo DB コレクションがあります。

各日付 (例: 2013-03-16) には、以下に示すように IND 、 US 、および SA の 3 つの国の値を含めることができます。

{
    "name": "SAM",
    "collection": [
        {
            "date": "2013-03-16",
            "country": "IND",
            "values": [
                {
                    "price": "24.0",
                    "gece": "342.1",
                    "countrycode": "IN"
                },
                {
                    "price": "24.0",
                    "gece": "322.1",
                    "countrycode": "IN"
                }
            ]
        },
        {
            "date": "2013-03-16",
            "country": "US",
            "values": [
                {
                    "price": "10.0",
                    "gece": "342.1",
                    "countrycode": "US"
                },
                {
                    "price": "120.0",
                    "gece": "342.1",
                    "countrycode": "US"
                }
            ]
        },
        {
            "date": "2013-03-16",
            "country": "SA",
            "values": [
                {
                    "price": "12.0",
                    "gece": "432.1",
                    "country": "SA"
                }
            ]
        },
        {
            "date": "2013-03-17",
            "country": "IND",
            "values": [
                {
                    "price": "10.0",
                    "gece": "532.1",
                    "country": "IN"
                }
            ]
        },
        {
            "date": "2013-03-17",
            "country": "US",
            "values": [
                {
                    "price": "38.0",
                    "gece": "332.1",
                    "country": "US"
                }
            ]
        }
    ]
}

以下のコードを使用して構造をテストしてみました。

  BasicDBObject query = new BasicDBObject();
        query.put("name", "SAM");
        query.put("collection.date", "2013-03-17");
        query.put("collection.country", "IND");
        BasicDBObject fields = new BasicDBObject();
        fields.put("name", 1);
        fields.put("collection.$", 1);

2013-03-17 の日付でクエリを実行していますが、2013-03-16 のデータが返されます。

応答は次のとおりです。

{
    "_id": {
        "$oid": "513121ac0651150e227d2224"
    },
    "name": "SAM",
    "collection": [
        {
            "date": "2013-03-16",
            "country": "IND",
            "values": [
                {
                    "price": "24.0",
                    "gece": "342.1",
                    "countrycode": "IN"
                },
                {
                    "price": "24.0",
                    "gece": "322.1",
                    "countrycode": "IN"
                }
            ]
        }
    ]
}

指定した日付に対して間違ったデータが返されるのはなぜですか?

編集部分をご覧ください

Mongo mongo = new Mongo();
DB db = mongo.getDB("test");
DBCollection mycollection = db.getCollection("xxx");


  BasicDBObject query = new BasicDBObject();
    query.put("name", "SAM");
    query.put("collection.date", "2013-03-16");
    query.put("collection.country", "IND");
    BasicDBObject fields = new BasicDBObject();
    fields.put("name", 1);
    fields.put("collection.$", 1);

    BasicDBObject subquery = new BasicDBObject();
    subquery.put("date", "2013-03-16");
    subquery.put("country", "IND");
    query.put("collection", new BasicDBObject("$elemMatch", subquery));


DBCursor cursor = mycollection.find(query);
while (cursor.hasNext()) {
    System.out.println(cursor.next());
}

それでも私はすべての結果を得ています

{ "_id" : { "$oid" : "513121ac0651150e227d2224"} , "name" : "SAM" , "collection" : [ { "date" : "2013-03-16" , "country" : "IND" , "values" : [ { "price" : "24.0" , "gece" : "342.1" , "countrycode" : "IN"} , { "price" : "24.0" , "gece" : "322.1" , "countrycode" : "IN"}]} , { "date" : "2013-03-16" , "country" : "US" , "values" : [ { "price" : "10.0" , "gece" : "342.1" , "countrycode" : "US"} , { "price" : "120.0" , "gece" : "342.1" , "countrycode" : "US"}]} , { "date" : "2013-03-16" , "country" : "SA" , "values" : [ { "price" : "12.0" , "gece" : "432.1" , "country" : "SA"}]} , { "date" : "2013-03-17" , "country" : "IND" , "values" : [ { "price" : "10.0" , "gece" : "532.1" , "country" : "IN"}]} , { "date" : "2013-03-17" , "country" : "US" , "values" : [ { "price" : "38.0" , "gece" : "332.1" , "country" : "US"}]}]}
4

1 に答える 1

3

$ 位置演算子を使用する場合は、クエリに配列フィールドを1 つだけ含めることができます。

クエリは次のようになります。

BasicDBObject subquery = new BasicDBObject();
subquery.put("date", "2013-03-17");
subquery.put("country", "IND");
query.put("collection", new BasicDBObject("$elemMatch", subquery));
于 2013-03-01T23:57:27.793 に答える