搜索数组包含项目的记录

时间:2016-07-06 19:45:56

标签: mongodb mongodb-query

我目前正在尝试了解如何搜索包含数组的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 个答案:

答案 0 :(得分: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逻辑来查找元素。请参阅文档:SEE DEMO HERE

以下是查询来自datasets集合的文件的查询,其中包含' Turnaround'在数据'的任何子子文档的第二个索引上子文档:

 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

我希望它有所帮助。