MongoDB(猫鼬)按数组查询

时间:2020-02-10 22:09:02

标签: node.js mongodb mongoose

文档示例:

{
    "_id" : ObjectId("5e41b8ecb6d9d829d07d3c5c"),
    "id" : "foo-bar-1",
    "__v" : 0,
    "books" : [ 
        {
            "_id" : ObjectId("5e41c81dbaa2b215082b52a1"),
            "chapters" : [ 
                {
                    "_id" : ObjectId("5e41c81dbaa2b215082b52a2"),
                    "title" : "Foo",
                    "pages" : 20
                },
                {
                    "_id" : ObjectId("5e41c81dbaa2b215082b52a3"),
                    "title" : "Bar",
                    "pages" : 34
                }
            ]
        }
    ],
    "last_updated" : ISODate("2020-02-10T15:10:50.027-05:00")
    }

嗨,

我想执行MongoDB查询,在其中找到与章节完全相同的books。 理想情况下,我想执行以下操作:

 const chapters = [{title: 'Foo', pages: 20},{title: 'Bar', pages: 34}];
 const book = await Model.findOne({'books.chapters': chapters});

但是,根据我的测试,这仅在chapters数组包含_id字段时才有效。在这种情况下,我将不知道子文档模式的ID是什么。比较数组时是否可以忽略它们和/或有更好的方法进行比较?

谢谢您的时间。

1 个答案:

答案 0 :(得分:0)

要匹配相同的数组字段,数组在所有方面都必须相同...字段,它们的顺序及其值...标题,页面,对象ID等

使用当前模式,那么您将需要通过聚合管道查询的阶段仅过滤出标题(也是页面计数吗?),然后使用相交来建立匹配...

取决于您的开发位置-如果还很早,您可以在数据输入过程中创建一个只有ChapterNames的新数组字段...除了现有的数组字段Chapters ...如果那还不能确定是否需要页数

仍在此潜在的新字段中,以数组形式匹配章节的标题必须以相同的顺序,相同的拼写进行。

如果您不要求所有章节都匹配-而是仅查找单个章节名称匹配-那么在当前模式中,您将设置$ unwind将数组拆分为单个元素以进行匹配...这也是在汇总管道阶段完成的。