เงื่อนไขในการค้นหา Mongo

ฉันมีคอลเลกชัน mongo พร้อม doc ดังนี้: -

{
    "_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"
            }
    ]
}

เป้าหมายของฉันคือค้นหา "id" ทั้งหมดใน "service" พูด "furniture" โดยเฉพาะเพื่อให้ได้ผลลัพธ์ดังนี้:

[122,123,124,127]

แต่ฉันไม่สามารถหาวิธีกำหนดกรอบเงื่อนไขได้

db.collection_name.find()

เนื่องจากความยากลำบากในการมีเงื่อนไขสำหรับองค์ประกอบ 'n' ในอาร์เรย์ "impressions[n]":"value"

ทางเลือกหนึ่งคือการใช้ "id"s ที่ได้รับดำเนินการรวมเพื่อค้นหาการแสดงผลสำหรับ "id" แต่ละรายการสำหรับบริการตามที่แนะนำโดยคำตอบสำหรับคำถามนี้ที่ฉันถามก่อนหน้านี้:- MapReduce ใน PyMongo

แต่ฉันต้องการเฉพาะรายการ 'id' ที่แตกต่างกันในบริการ ไม่ใช่การแสดงผล กรุณาช่วย!


person nimeshkiranverma    schedule 17.07.2015    source แหล่งที่มา
comment
โปรดตรวจสอบเอกสารด้านบนอีกครั้งได้ไหม เอกสารด้านบนมีช่อง _uid 2 ช่องและช่องการแสดงผล 2 ช่อง ควรแยกเป็น 2 เอกสารหรือไม่   -  person sheilak    schedule 17.07.2015


คำตอบ (1)


คุณต้องมีกรอบงานการรวมกลุ่มเพื่อให้ได้ผลลัพธ์ที่มีความหมาย มากเช่นนี้:

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

หรือดีกว่าด้วย MongoDB 2.6 หรือสูงกว่า ซึ่งสามารถลบรายการอาร์เรย์ที่ไม่ตรงกัน "ก่อน" ถึง $unwind ด้วย $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"
    }}
])

ซึ่งให้ผล:

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

ไม่ใช่ "รายการ" ธรรมดา แต่เพียงแปลงมันดังนั้น:

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

map(mapper,result)

Or:

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

ให้คุณ:

[122, 124, 127, 123]

หากคุณต้องการให้ "เรียงลำดับ" ให้เพิ่ม $sort อยู่ที่ส่วนท้ายของไปป์ไลน์การรวมหรือเรียงลำดับรายการผลลัพธ์ในโค้ด

person Blakes Seven    schedule 17.07.2015