我有一个MongoDB
collection
,其结构如下:
/* 1 */
{
"_id" : ObjectId("5c09a454dd42360001fd2515"),
"conversations" : {
"0" : {
"message" : "Message 1",
.
.
.
},
"1" : {
"message" : "Message 1"
.
.
.
},
"2" : {
"message" : "Message 5"
.
.
.
},
"3" : {
"message" : "Message 1"
.
.
.
},
"4" : {
"message" : "Message 2"
.
.
.
},
"5" : {
"message" : "Message 3"
},
"6" : {
"message" : "compliance"
},
"7" : {
"message" : "Google"
}
}
/* 2 */
{
"_id" : ObjectId("5c09a673c2a98f00012f4efb"),
"conversations" : {
"0" : {
"message" : "Message 11"
},
"1" : {
"message" : "Google",
},
"2" : {
"message" : "Message 7"
}
}
/* 3 */
{
"_id" : ObjectId("5c09f570173f7900015a82b2"),
"conversations" : {
"0" : {
"message" : "Message 4"
},
}
.
.
.
在上面的示例数据中,我在collection
内有一组文档,并且在每个文档中都有一个名为conversations
的字典字段数组。在此字段中,我具有词典字段的列表(0
,1
,2
...)。我想做的是过滤所有conversations
字段中message
值为Message 4
的所有文档。
我知道过滤到每个文档中特定字段的方法是db.getCollection('collection_1').find({conversation:""})
,但是我不知道如何将其应用于字典字段列表,例如我的案例。有帮助吗?
答案 0 :(得分:1)
您需要$objectToArray运算符才能将具有未知键的对象转换为k
和v
字段的数组。然后,可以在$expr内对该数组应用$filter来检查是否有任何message
等于"Message 4"
db.collection.aggregate([
{
$match: {
$expr: {
$ne: [
{
$size: {
$filter: {
input: { $objectToArray: "$conversations" },
as: "conv",
cond: { $eq: [ "$$conv.v.message", "Message 4" ] }
}
}
},
0
]
}
}
}
])