这可以通过使用聚合管道来实现。假设您的收藏如下所示:
[
{
"_id": 1,
property: true,
},
{
"_id": 2,
firstDate: "First date"
},
{
"_id": 3,
lastDate: "Last name"
},
{
"_id": 4,
date: "date"
},
{
"_id": 5,
property: true
},
{
"_id": 6,
name: "Name"
}
]
首先,您必须创建一个包含键和值数组的属性,以便稍后按键进行过滤。这可以通过在$addFields 中使用$objectToArray 来完成。
db.collection.aggregate([
{
$addFields: {
keysAndValues: {
$objectToArray: "$$ROOT",
}
}
}
]);
如果您将$$ROOT 传递给它,您将创建一个包含所有文档键和值的数组。因此,此时您的数据将如下所示:
[
{
"_id": 1,
"keysAndValues": [
{
"k": "_id",
"v": 1
},
{
"k": "property",
"v": true
}
],
"property": true
},
...
{
"_id": 6,
"keysAndValues": [
{
"k": "_id",
"v": 6
},
{
"k": "name",
"v": "Name"
}
],
"name": "Name"
}
]
所以你现在可以添加一个$match 阶段,使用$regex 来按如下键进行过滤:
db.collection.aggregate([
{
$addFields: {
keysAndValues: {
$objectToArray: "$$ROOT",
}
}
},
{
$match: {
"keysAndValues.k": {
$regex: "date",
$options: "i",
}
}
}
]);
此时,您已经获得了所需的结果,所有在键中包含单词date 的文档,然后您可以取消设置您创建的属性以使过滤成为可能,keysAndValues,以清理数据。
db.collection.aggregate([
{
$addFields: {
keysAndValues: {
$objectToArray: "$$ROOT",
}
}
},
{
$match: {
"keysAndValues.k": {
$regex: "date",
$options: "i",
}
}
},
{ $unset: 'keysAndValues' },
]);
在此之后,您的最终结果将是:
[
{
"_id": 2,
"firstDate": "First date"
},
{
"_id": 3,
"lastDate": "Last name"
},
{
"_id": 4,
"date": "date"
}
]
您可以在这个操场上看到一个工作示例:
https://mongoplayground.net/p/U5FjTOVQIwb