MongoDB中的子查询,用于返回具有特定字段的单个元素

问题描述 投票:0回答:2

我有两个集合,其中一个具有一个数组,其中另一个数组具有ID。我需要从第一个集合中返回一个元素,并从第二个集合中返回一个元素,但仅返回具有特定字段的元素。我会澄清一下。

我尝试使用它来做某事,但无法完全理解操作。https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/

我的问题:

{
  "solved": false,
  "answer": [
     "5d969dbf7d496a256443eeca",
     "5d969f7b7d496a256443eecb"
  ],
  "_id": "5d93dfaf40024619dcc61896",
  "user": "5d8963afa0014a289c8d7112",
  "title": "Ola mundo",
  "description": "esse e um teste",
  "discipline": "5d8fb8e04becf712f8293b5b",
  "createdAt": "2019-10-01T23:22:23.168Z",
  "__v": 0
},

我的遮阳篷

{
  "official": false,
  "_id": "5d969dbf7d496a256443eeca",
  "description": "Toma aqui a sua resposta",
  "createdAt": "2019-10-04T01:17:51.454Z",
  "__v": 0
},
{
  "official": true,
  "_id": "5d969f7b7d496a256443eecb",
  "description": "Esste e um teeeeste",
  "createdAt": "2019-10-04T01:25:15.829Z",
  "__v": 0
}

我需要返回问题模型和Awnser模型,其中“正式”字段等于“真”。我是mongoDB的新手,所以我正在寻求帮助。我以为可能在sql中有类似子查询的东西。

mongodb join mongoose objectid
2个回答
0
投票

最简单的方法是使用聚合。

您需要使用$ lookup将答案数组中的所有ID都加入Answer集合中,然后使用$ filter通过“官方”对其进行过滤。

如果_id匹配,则从Answer集合中加入文档

{
    $lookup: {
        from: "Answer",
        foreignField: "_id",
        localField: "answer",
        as: "answer"
    }

}

结果将是:

{
    "_id" : ObjectId("5d93dfaf40024619dcc61896"),
    "solved" : false,
    "answer" : [
        {
            "_id" : ObjectId("5d969dbf7d496a256443eeca"),
            "official" : false,
            "description" : "Toma aqui a sua resposta",
            "createdAt" : "2019-10-04T01:17:51.454Z",
            "__v" : 0
        },
        {
            "_id" : ObjectId("5d969f7b7d496a256443eecb"),
            "official" : true,
            "description" : "Esste e um teeeeste",
            "createdAt" : "2019-10-04T01:25:15.829Z",
            "__v" : 0
        }
    ],
    "user" : "5d8963afa0014a289c8d7112",
    "title" : "Ola mundo",
    "description" : "esse e um teste",
    "discipline" : "5d8fb8e04becf712f8293b5b",
    "createdAt" : "2019-10-01T23:22:23.168Z",
    "__v" : 0
}

现在您已加入文档,您可以使用$ addFields和$ filter在“官方”字段中对其进行过滤。 $ addFields将新字段添加到文档https://docs.mongodb.com/manual/reference/operator/aggregation/addFields/。在此解决方案中,我使用相同的字段名称“ answer”,它将用过滤的文档覆盖答案数组。

{
    $addFields: {
        answer: {
            $filter: {
                input: "$answer",
                as: "answer",
                cond: { $eq: [ "$$answer.official", true ] }
            }
        }

    }
}

结果将是:

{
    "_id" : ObjectId("5d93dfaf40024619dcc61896"),
    "solved" : false,
    "answer" : [
        {
            "_id" : ObjectId("5d969f7b7d496a256443eecb"),
            "official" : true,
            "description" : "Esste e um teeeeste",
            "createdAt" : "2019-10-04T01:25:15.829Z",
            "__v" : 0
        }
    ],
    "user" : "5d8963afa0014a289c8d7112",
    "title" : "Ola mundo",
    "description" : "esse e um teste",
    "discipline" : "5d8fb8e04becf712f8293b5b",
    "createdAt" : "2019-10-01T23:22:23.168Z",
    "__v" : 0
}

这是完整的查询:

db.Question.aggregate([
{
    $lookup: {
        from: "Answer",
        foreignField: "_id",
        localField: "answer",
        as: "answer"
    }

},
{
    $addFields: {
        answer: {
            $filter: {
                input: "$answer",
                as: "answer",
                cond: { $eq: [ "$$answer.official", true ] }
            }
        }

    }
}])

0
投票

看起来您已经在使用猫鼬,因此可以使用populate with query condition解决您的问题。类似于:

Question.find(...).populate({
  path: 'answer',
  match: { official: true}
})
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.