如何查询嵌入式文档

时间:2020-11-09 12:42:52

标签: database mongodb mongoose mongodb-query aggregation-framework

{
    "_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。谁能帮助我构建查询。

2 个答案:

答案 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

工作Mongo playground

答案 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 } }
])
相关问题