arrays - Mongoose中,基于数组查询字段

标签 arrays node.js mongodb mongoose

我正在尝试根据从 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"
                }
            ]
    }
]

最适合 Mongoose 查询:

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"}}}' ]

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

最佳答案

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

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 }) ) }

关于arrays - Mongoose中,基于数组查询字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54287723/

相关文章:

python - 一串输入 : Ints seperated by ' ' need to print array in reverse

java - 搜索字符串数组

JAVA 员工类型与数组

node.js - 导出声明类型 ResourceType = Lowercase<Protocol.Network.ResourceType>,使用 Puppeteer 和 typescript 构建 nodejs 应用程序时出错

mongodb - 如何拦截和记录 mongodb 查询?

mongodb 在意外关闭后崩溃

javascript - 每隔一段时间将项目从 JavaScript 数组中逐一输出到 HTML 文本

javascript - 为什么我得到空结果?

javascript - FFMPEG 制作的 MP4 无法播放/打开

javascript - 我如何在 MongoDB 中伪造一个多项目 $pop?