Kondisi di Find, Mongo

Saya memiliki koleksi mongo dengan dokumen sebagai berikut: -

{
    "_id" : ObjectId("55a9378ee2874f0ed7b7cb7e"),
    "_uid" : 10,
    "impressions" : [
            {
                    "pos" : 6,
                    "id" : 123,
                    "service" : "furniture"
            },
            {
                    "pos" : 0,
                    "id" : 128,
                    "service" : "electronics"
            },
            {
                    "pos" : 2,
                    "id" : 127,
                    "service" : "furniture"
            },
            {
                    "pos" : 2,
                    "id" : 125,
                    "service" : "electronics"
            },
            {
                    "pos" : 10,
                    "id" : 124,
                    "service" : "electronics"
            }
    ]
},
{
    "_id" : ObjectId("55a9378ee2874f0ed7b7cb7f"),
    "_uid" : 11,
    "impressions" : [
            {
                    "pos" : 1,
                    "id" : 124,
                    "service" : "furniture"
            },
            {
                    "pos" : 10,
                    "id" : 124,
                    "service" : "electronics"
            },
            {
                    "pos" : 1,
                    "id" : 123,
                    "service" : "furniture"
            },
            {
                    "pos" : 21,
                    "id" : 122,
                    "service" : "furniture"
            },
            {
                    "pos" : 3,
                    "id" : 125,
                    "service" : "electronics"
            },
            {
                    "pos" : 10,
                    "id" : 121,
                    "service" : "electronics"
            }
    ]
}

Tujuan saya adalah menemukan semua "id" dalam "service" tertentu, katakanlah "furniture" yaitu untuk mendapatkan hasil seperti ini:

[122,123,124,127]

Tetapi saya tidak dapat menemukan cara untuk membingkai kondisi tersebut

db.collection_name.find()

karena sulitnya mendapatkan kondisi untuk elemen 'n' dalam array, "impressions[n]":"value".

Salah satu opsinya adalah menggunakan "id"s yang diperoleh untuk melakukan operasi agregat guna menemukan tayangan untuk setiap "id" layanan seperti yang disarankan oleh jawaban atas pertanyaan yang saya ajukan sebelumnya:- MapReduce di PyMongo.

Tapi saya hanya ingin daftar 'id' yang berbeda dalam suatu layanan, bukan tayangannya. Mohon bantuannya!


person nimeshkiranverma    schedule 17.07.2015    source sumber
comment
Bisakah Anda memeriksa ulang dokumen Anda di atas? Dokumen di atas memiliki 2 bidang _uid dan 2 bidang tayangan, haruskah keduanya menjadi 2 dokumen terpisah?   -  person sheilak    schedule 17.07.2015


Jawaban (1)


Anda memerlukan kerangka kerja agregasi untuk mendapatkan hasil yang berarti. Kurang lebih seperti ini:

result = db.collection.aggregate([
    { "$match": {
        "impressions.service": "furniture"
    }},
    { "$unwind": "$impressions" },
    { "$match": {
        "impressions.service": "furniture"
    }},
    { "$group": {
        "_id": "$impressions.id"
    }}
])

Atau lebih baik lagi dengan MongoDB 2.6 atau lebih tinggi, yang dapat menghapus item array yang tidak cocok "sebelumnya" ke $unwind dengan $redact:

result = db.collection.aggregate([
    { "$match": {
        "impressions.service": "furniture"
    }},
    { "$redact": {
       "$cond": {
           "if": { 
               "$eq": [
                   { "$ifNull": [ "$service", "furniture" ] },
                   "furniture"
               ]
           },
           "then": "$$DESCEND",
           "else": "$$PRUNE"
       }
    }},
    { "$unwind": "$impressions" },
    { "$group": {
        "_id": "$impressions.id"
    }}
])

Yang menghasilkan:

{ "_id" : 122 }
{ "_id" : 124 }
{ "_id" : 127 }
{ "_id" : 123 }

Bukan "daftar" biasa, tetapi ubah saja, oleh karena itu:

def mapper (x):
    return x["_id"]

map(mapper,result)

Or:

map(lambda x: x["_id"], result)

Untuk memberi Anda:

[122, 124, 127, 123]

Jika Anda ingin "diurutkan" maka tambahkan $sort tahap di akhir pipa agregasi atau mengurutkan daftar yang dihasilkan dalam kode.

person Blakes Seven    schedule 17.07.2015