【问题标题】:Mongoose find in object array value猫鼬在对象数组值中查找
【发布时间】:2016-04-07 11:53:43
【问题描述】:

文章对象数组示例:

[
    {
        "_id": "72",
        "title": "Some title",
        "comments": [
            {
                "title": "title 1",
                "_id": "0",
            },
            {
                "title": "title 2",
                "_id": "1",
            },
            {
                "title": "title 3",
                "_id": "2",
            }
        ]
    },
    (...)
]

我想根据他们的 cmets 标题(已填充)查找一些文章

var ArticleSchema = new Schema({
    title: { type: String },
    comments: [{ type: Schema.ObjectId, ref: 'Comment' }]
});

我尝试了很多方法,例如:

var options = {
    criteria: {
        'comments.title': regex
    }
};

Article
    .find(options.criteria, function (err, articles) {
        if (err) throw err;
        res.json(articles);
    })
    .populate('comments');

但不起作用...

谢谢

  • 更新 *

这是我的新代码:三个嵌套的 find() 和两个 forEach()

【问题讨论】:

标签: javascript node.js mongodb mongoose


【解决方案1】:

更新中的代码(或类似内容)是使用当前架构执行此操作的唯一方法。但是,我将提出另一个选项,它可能适用于您的其他用例,也可能不适用。

首先,为了确保我们都在同一页面上,我相信您当前的设置在保存到数据库时实际上看起来像这样:

文章集(单项)

{
    _id: ObjectId("566d820ff8633ffc494998c5"),
    title: "Example Post",
    comments: [
        ObjectId("eed7ceadc82d23441cdbab8c")
    ]
}

评论集(单个条目)

{
    _id: ObjectId("eed7ceadc82d23441cdbab8c"),
    title: "Example Comment on Example Post"
}

当您ref 另一个架构时,这就是它的工作原理。我提出这一点是因为这与您的文章对象示例不同。

与关系数据库(如 MySQL)不同,MongoDB 没有连接。填充基本上是通过运行您的查询,然后为所有评论 ID 运行 find 命令来工作的。但是,MongoDB 有子文档。如果您要将 ArticleSchema 更改为以下内容:

var ArticleSchema = new Schema({
    title: { type: String },
    comments: [ CommentSchema ]
});

您在数据库中的数据结构将与您的示例相匹配,并且由于您的所有信息都将在一个集合中,因此您可以轻松地执行您正在尝试的搜索。

但是,这可能会使您执行的其他查询更加困难,因此这取决于您的用例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-22
    • 2017-03-28
    • 2019-03-28
    • 2016-02-05
    • 1970-01-01
    • 2021-01-24
    • 2021-10-15
    • 2020-09-12
    相关资源
    最近更新 更多