我目前正在尝试了解如何搜索包含数组的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: {})
的几种变体,但没有运气。有人能指出我正确的方向吗?
答案 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
我希望它有所帮助。