【问题标题】:In Mongoose, query fields based on arrayMongoose中,基于数组查询字段
【发布时间】:2019-06-14 17:03:15
【问题描述】:

我正在尝试根据从 URL 发送的输入查询参数数组从 mongodb 集合中查询文档。

示例数据库数据

[
    {
        "drawings": {
            "circle": [],
            "square": [
                {
                    "id": "828",
                    "name": "square"
                }
            ],
            "cube": []
    },
    {
        "drawings": {
            "circle": [
                {
                    "id": "827",
                    "name": "circle"
                }
            ],
            "square": [],
            "cube": []
    },
    {
        "drawings": {
            "circle": [],
            "square": [],
            "cube": [
                {
                    "id": "829",
                    "name": "cube"
                }
            ]
    }
]   

输入查询参数:

query = ["square","cube"];

预期输出:

[
    {
        "drawings": {
            "circle": [],
            "square": [
                {
                    "id": "828",
                    "name": "square"
                }
            ],
            "cube": []
    },
    {
        "drawings": {
            "circle": [],
            "square": [],
            "cube": [
                {
                    "id": "829",
                    "name": "cube"
                }
            ]
    }
]

最适合猫鼬查询:

Schema.find({
    $or:[
        {'drawings.square':{$elemMatch:{ name:'square'}}},
        {'drawings.cube':{$elemMatch:{ name:'cube'}}}
    ]
});

尝试以下方法。但是,这是不正确的。

let draw = ["square","cube"];
let draw_query =[];
for (let a=0; a<draw.length;a++){
    draw_query.push("{\"drawings."+ draw[a] +"\':{$elemMatch:{ name:\"" + draw[a] + "\"}}}");
}

它使用单引号字符串创建数组。无法使用。

[ '{"drawings.square":{$elemMatch:{ name:"square"}}}',
  '{"drawings.cube":{$elemMatch:{ name:"cube"}}}' ]

如何动态生成这个猫鼬查询?或者有没有更好的猫鼬查询来达到预期的结果。

【问题讨论】:

    标签: arrays node.js mongodb mongoose


    【解决方案1】:

    您可以使用点符号直接查询它,因此查询应如下所示:

    db.collection.find({
      $or: [
        {
          "drawings.square.name": "square"
        },
        {
          "drawings.circle.name": "circle"
        }
      ]
    })
    

    你可以使用.map()在JS中构建它,试试:

    var query = ["square","cube"];
    var orQuery = { $or: query.map(x => ({ [x + ".name"]: x }) ) }
    

    【讨论】:

      猜你喜欢
      • 2020-09-14
      • 2021-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-27
      • 2021-04-27
      • 2013-07-06
      • 1970-01-01
      相关资源
      最近更新 更多