javascript Mongoose检索所有未在同一集合的数组字段中引用的文档

gudnpqoy  于 2023-06-04  发布在  Java
关注(0)|答案(2)|浏览(237)

我有下面的Post模式。post架构包含一个数组字段,该字段可能包含其他post作为回复。我想做的是检索没有在任何职位的答复领域引用的所有文件。基本上得到所有的职位,不是一个原始职位的答复。

const mongoose = require('mongoose');

const schema = new mongoose.Schema({
    creator: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'User',
        validate: [mongoose.Types.ObjectId.isValid, 'Creator ID is invalid']
    },
    owner: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'User',
        validate: [mongoose.Types.ObjectId.isValid, 'Owner ID is invalid']
    },
    content: {
        type: String,
        required: 'Content is required'
    },
    likes: [
        {
            type: mongoose.Schema.Types.ObjectId,
            ref: 'Like',
            validate: [mongoose.Types.ObjectId.isValid, 'Like ID is invalid']
        }
    ],
    replies: [
        {
            type: mongoose.Schema.Types.ObjectId,
            ref: 'Post'
        }
    ]
}, {
    autoCreate: true,
    timestamps: true
});

const Post = mongoose.model('Post', schema);

module.exports = Post;

我试过使用$lookup$match$nin,但我不能使它正常工作。任何帮助将不胜感激。

r6hnlfcb

r6hnlfcb1#

我认为更新模式以跟踪a)是否是原始帖子或b)是否是回复会更容易。然后,您可以只通过该布尔字段进行查询,而不是通过一系列数组进行循环。

bttbmeg0

bttbmeg02#

如果我没有弄错的话,这似乎是可行的:

let posts = await MODELS.Post.aggregate([
                {
                    $lookup: {
                        from: 'posts',
                        localField: '_id',
                        foreignField: 'replies',
                        as: 'references'
                    }
                },
                {
                    '$match': {
                        'references._id': {
                            '$exists': false
                        }
                    }
                },
                {
                    '$sort': {
                        createdAt: -1
                    }
                },
                {
                    '$project': { 
                        references: false
                    }
                },
                {
                    '$limit': 10
                }
            ]);

相关问题