【问题标题】:How to find data from nested array in Mongoose?如何从 Mongoose 的嵌套数组中查找数据?
【发布时间】:2021-09-11 01:09:19
【问题描述】:

我有两个 id:publisherID 和 BookID。

我的猫鼬数据库看起来像:

现在的问题是:我想找到 userId,其中 publishderId 是 59l55llopd3W1FuosGgN 并且 bookId 是 G1Vfe2NwS3sy-qhT1J0g6

我创建了以下返回空数据的函数。

const allTheRelatedData = (publiserId, bookId) => {
    return new Promise((resolve, reject) => {
        try {
            myBookSchema
                .findOne({
                    publisherId: publisherId,
                    "books.$.bookId": bookId,
                })
                .then((data) => {
                    console.log(data);
                    resolve(data);
                })
                .catch((error) => {
                    console.log(error);
                    reject(error);
                });
        } catch (error) {
            console.log(error);
            reject(error);
        }
    });
};

当我运行这段代码时,它给出了空数据。请帮忙,我尝试了很多解决方案,如位置、匹配等。没有任何效果。请帮忙。

【问题讨论】:

    标签: arrays mongodb mongoose mongoose-schema mern


    【解决方案1】:

    也许这会起作用

    const allTheRelatedData = (publiserId, bookId) => {
        return new Promise((resolve, reject) => {
            try {
                myBookSchema
                    .find()
                    .then((data) => {
                        const item = data.filter(i => i.publisherId === publisherId && i.books.includes(book => book.bookId === bookId))
                        if (item) {
                            console.log(item);
                            resolve(item);
                        } else {
                            console.log("Not found");
                            reject("Not found");
                    })
                    .catch((error) => {
                        console.log(error);
                        reject(error);
                    });
            } catch (error) {
                console.log(error);
                reject(error);
            }
        });
    };
    

    【讨论】:

    • 这个不工作 @im2rando 也收到一条消息 data.filter 不是一个函数。
    【解决方案2】:

    您可以使用$ projection operator 来做到这一点:

    myBookSchema
      .findOne({
        publisherId: publisherId,
        "books.bookId": bookId,
      }, {
        "books.$": 1
      }
    ).then((data) => {...
    

    然后您可以使用data.books[0].userId 获取userId,并记得使用if (data && data.books && data.books.length)... 检查数据或书籍是否存在

    【讨论】:

    • 你能说出行中的 1 是什么:books.$: 1 吗?因为我不知道这本书的索引。
    • 它将选择条件中匹配"books.bookId": bookId的第一本书。您可以在我提供的链接中找到更多信息
    • 抱歉,但此代码:.findOne( { publisherId: publisherId, "books.bookId": bookId, }, { "books.$": 1 } ) 也不起作用。
    • 当我用 0 替换 1 时,它给了我错误:MongoError: positional projection cannot be used with exclude
    • "books.$": 1 是用于投影,而不是用于条件。
    猜你喜欢
    • 1970-01-01
    • 2018-09-10
    • 2022-09-29
    • 2016-02-09
    • 2012-07-05
    • 2017-02-22
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    相关资源
    最近更新 更多