2016-07-06 64 views
0

我正在試圖找出如何搜索包含數組的mongoDB文檔。我想查找任何具有包含值X的數組的記錄。下面是我的文檔結構的示例。正在搜索一個數組中包含項目的記錄

{ 
"_id" : ObjectId("577d5c3c2c7e949307270d43"), 
"name" : "Cruise Data", 
"author" : "test", 
"source" : "", 
"headings" : [ 
    "\"Arrival Date\"", 
    "Vessel", 
    "Cruise Call", 
    "Hash Items", 
    "Row Hash" 
], 
"data" : { 
    "1" : [ 
     "05 Jan 2016", 
     "Black Watch (Fred Olsen)", 
     "Turnaround", 
     "b5740452f7d83a243d84fc3d8f72b312" 
    ], 
    "2" : [ 
     "26 Apr 2016", 
     "Boudicca (Fred Olsen)", 
     "Transit", 
     "0bf1b79a58b4bb943763f3745543497b" 
    ], 
}, 
"updated_at" : ISODate("2016-07-06T19:30:04.799Z"), 
"created_at" : ISODate("2016-07-06T19:30:04.799Z") 

}

我在尋找的值是數據對象的MD5哈希值。 (例如:0bf1b79a58b4bb943763f3745543497b)。我已經嘗試了db.getCollection('datasets').find({data: {})的幾個變體,但沒有運氣。有人能夠指引我正確的方向嗎?

回答

1

爲此,您需要使用已知鍵的格式爲字段「數據」建模。例如:

"data": [ 
    { 
     id: '1', 
     date: "05 Jan 2016", 
     name: "Black Watch (Fred Olsen)", 
     type: "Turnaround", 
     md5: "b5740452f7d83a243d84fc3d8f72b312" 
    }, 
    { 
     id: '2', 
     date: "26 Apr 2016", 
     name: "Boudicca (Fred Olsen)", 
     type: "Transit", 
     md5: "0bf1b79a58b4bb943763f3745543497b" 
    } 
] 

然後你就可以通過下面的查詢很容易地找到它: db.datasets.find({'data.md5':'0bf1b79a58b4bb943763f3745543497b'})

如果這是不可能改變的數據模型,那麼你可以使用$where和編寫自定義JavaScript邏輯找到要素)。見文檔:https://docs.mongodb.com/manual/reference/operator/query/where/

這裏是要找到從datasets收集具有對「數據」子文檔的任何子子文檔的第二個指數「轉機」文件查詢:

db.datasets.find({ $where: function() { var searchItem = 'Turnaround'; var dataObj = this.data; for (var key in dataObj) { var valueList = dataObj[key]; if (valueList.indexOf(searchItem) != -1) { return true; } } return false; } }) 

請注意$where不使用指標,所以使用它需要您自擔風險:P

我希望它有幫助。

+0

感謝您的回覆Manish。沒有其他方法可以在不添加指定鍵的情況下執行此操作嗎? 我使用的數據不知道(將CSV導入爲單個文檔)的結構,因此鍵入它們可能會很困難。我還會着眼於強制列標題,儘管如此。 – Xopa

+0

@Xopa,我編輯了我的答案。 – Manish

+0

謝謝。我仍然會着眼於以編程方式更改數據集,但是丟失索引可能會造成太大的損失 – Xopa

相關問題