{
"_id" : ObjectId("5fa919a49bbe481d117506c9"),
"isDeleted" : 0,
"productId" : 31,
"references" : [
{
"_id" : ObjectId("5fa919a49bbe481d117506ca"),
"languageCode" : "en",
"languageId" : 1,
"productId" : ObjectId("5fa919a49bbe481d117506ba")
},
{
"_id" : ObjectId("5fa91cc7d7d52f1e389dee1f"),
"languageCode" : "ar",
"languageId" : 2,
"productId" : ObjectId("5fa91cc7d7d52f1e389dee1e")
}
],
"createdAt" : ISODate("2020-11-09T10:27:48.859Z"),
"updatedAt" : ISODate("2020-11-09T10:27:48.859Z"),
"__v" : 0
},
{
"_id" : ObjectId("5f9aab1d8e475489270ebe3a"),
"isDeleted" : 0,
"productId" : 21,
"references" : [
{
"_id" : ObjectId("5f9aab1d8e475489270ebe3b"),
"languageCode" : "en",
"languageId" : 1,
"productId" : ObjectId("5f9aab1c8e475489270ebe2d")
}
],
"createdAt" : ISODate("2020-10-29T11:44:29.852Z"),
"updatedAt" : ISODate("2020-10-29T11:44:29.852Z"),
"__v" : 0
}
这是我的mongoDB集合,我在其中存储对产品集合的多语言引用。在productId中是对产品Collection的引用。现在,如果我们在请求中包含ar,那么我们将仅具有ar languageCode的productId。如果该languageCode不存在,那么我们将获得langCode productId。
例如,如果用户通过ar,则查询应返回
"productId" : ObjectId("5fa91cc7d7d52f1e389dee1e")
"productId" : ObjectId("5f9aab1c8e475489270ebe2d")
我尝试将$ or与$ elemMatch结合使用,但无法获得所需的结果。我也在考虑使用$ cond。谁能帮助我构建查询。
答案 0 :(得分:2)
我们可以实现
$facet
有助于对收到的文档进行分类arArray
中,我们获取所有具有"references.languageCode": "ar"
的文档(此文档可以或不可以具有en
),然后将{ {1}}数组,然后仅使用references
选择"references.languageCode": "ar"
。 $match
有助于获取属于$group
的所有productIds "references.languageCode": "ar"
中,我们仅获取仅具有enArray
的文档。其他与"references.languageCode": "en"
类似。arArray
有助于概念化arArray和enArray数组$concatArrays
帮助分解数组。$unwind
有助于使对象进入根目录这是mongo脚本。
$replaceRoot
答案 1 :(得分:0)
您可以测试此解决方案,以查看它是否对您有帮助:
db.collection.aggregate([
{
$addFields: {
foundResults:
{
$cond: {
if: { $in: ["ar", "$references.languageCode"] }, then:
{
$filter: {
input: "$references",
as: "item",
cond: {
$and: [{ $eq: ["$$item.languageCode", 'ar'] },
]
}
}
}
, else:
{
$filter: {
input: "$references",
as: "item",
cond: {
$and: [{ $eq: ["$$item.languageCode", 'en'] },
]
}
}
}
}
}
}
},
{ $unwind: "$foundResults" },
{ $replaceRoot: { newRoot: { $mergeObjects: ["$foundResults"] } } },
{ $project: { _id: 0, "productId": 1 } }
])