2014-10-06 45 views
-1

我有以下蒙戈文件,這是被稱爲屬性的更大的文件,其中也有顏色和尺寸如何獲得MongoDB的深嵌入式文件編號

> db.attributes.find({'name': {'en-UK': 'Fabric'}}).pretty() 
{ 
    "_id" : ObjectId("543261cda14c971132fa2b91"), 
    "values" : [ 
     { 
      "source" : [ 
       { 
        "_id" : ObjectId("543261cda14c971132fa2b79"), 
        "name" : { 
         "en-UK" : "Combed Cotton" 
        } 
       }, 
      ], 
      "name" : [ 
       { 
        "_id" : ObjectId("543261cda14c971132fa2b85"), 
        "name" : { 
         "en-UK" : "Brushed 3-ply" 
        } 
       }, 
       { 
        "_id" : ObjectId("543261cda14c971132fa2b8f"), 
        "name" : { 
         "en-UK" : "Plain Weave" 
        } 
       }, 
       { 
        "_id" : ObjectId("543261cda14c971132fa2b90"), 
        "name" : { 
         "en-UK" : "1x1 Rib" 
        } 
       } 
      ] 
     } 
    ], 
    "name" : { 
     "en-UK" : "Fabric" 
    } 

}

我想要的一部分返回一個子文檔的_id並且具有以下內容:

db.attributes.aggregate([ 
    { '$match': {'name.en-UK': 'Fabric'} }, 
    { '$unwind' : '$values' }, 
    { '$project': { 'name' : '$values.name'} }, 
    { '$match': { '$and': [{"name.name.en-UK" : "1x1 Rib"} ] }} 
]) 

這樣做的正確方法是什麼?

而且,Fabric值是兩個項目,sourcename一個數組,但如果我填充它喜歡:

> db.attributes.find({'name': {'en-UK': 'Fabric'}}).pretty() 
{ 
    "_id" : ObjectId("543261cda14c971132fa2b91"), 
    "values" : { 
      "source" : [{ ... }] 
      "name": [{ ... }] 
    } 
} 

我收到以下錯誤

「ERRMSG」:「異常:$ unwind:字段路徑末尾的值必須是一個數組「

但是如果我把它包在一個方括號裏面,那麼這個工作,所以

> db.attributes.find({'name': {'en-UK': 'Fabric'}}).pretty() 
{ 
    "_id" : ObjectId("543261cda14c971132fa2b91"), 
    "values" : [{ 
      "source" : [{ ... }], 
      "name": [{ ... }] 
    }] 
} 

我缺少什麼作爲values是兩個對象,sourcename陣列,每個包含的任何意見大加讚賞

回答

0

陣列

的列表,你似乎什麼被「丟失」在這裏是你的文檔中的「一些」根本不包含「value」屬性,或者至少它「不是數組」。這是你給出的錯誤的基本上下文。

幸運的是,有幾種方法可以解決這個問題。也就是說,在提交原始查詢時,「測試」陣列的存在。或者在處理流水線時實際上「替換」丟失的元素作爲某種數組。

這裏是什麼是一個有效的冗餘形式,因爲第一$match條件真的梳理了這一點,這兩種方法

db.attributes.aggregate([ 
    { "$match": { 
     "name.en-UK": "Fabric", 
     "values.0": { "$exists": true } 
    }}, 
    { "$project": { 
     "name": 1, 
     "values": { "$ifNull": [ "$values", [] ] } 
    }}, 
    { "$unwind": "$values" }, 
    { "$unwind": "$values.name" }, 
    { "$match": { "values.name.name.en-UK" : "1x1 Rib" }} 
]) 

因此,正如我說。真的多餘,因爲最初的$match實際上詢問是否存在「初始數組元素」。那裏有一個數組是哪種意思。

第二個$project階段實際上使用$ifNull運算符來「填充」一個值(或基本上是一個空數組),其中被測元素不存在。我們之前對此進行了測試,但是這表明了不同的方法。

但基本想法id要麼「避免」或「填充」您的文檔沒有您想要處理的預期數據。這是你錯誤的原因。

+0

對不起,我得到一個空的結果,'{「result」:[],「ok」:1}' – khinester 2014-10-06 11:35:30

+0

@khinester你並不完全容易。下次在提交時從您的帖子中刪除「標籤」字符。用重要線條編輯。 – 2014-10-06 12:12:46