Node.js Mongoose如何在数组中查找对象

Node.js Mongoose如何在数组中查找对象,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我试过几种方法,但都不管用。如何从2数组中查找对象。我的尝试: Message.find({$and : [{_id : id}, {"users._id" : userID}]}) 我的消息模式 const contentSchema = new Schema({ ismy : Boolean, message : String },{ timestamps: true }); const receiverSchema = new Schema({

我试过几种方法,但都不管用。如何从2数组中查找对象。我的尝试:

Message.find({$and : [{_id : id}, {"users._id" : userID}]})
我的消息模式

const contentSchema = new Schema({
    ismy : Boolean,
    message : String
},{ timestamps: true });


const receiverSchema = new Schema({
    _id : String,
    messages : [contentSchema]
});


const messageSchema = new Schema({
    _id : String,
    users : [receiverSchema]
});

module.exports = mongoose.model('Message',messageSchema);
已返回所有文档,但我需要具有
“\u id”的文档:“5f38f3574644e92d0cbbc5be”,


可能有更简单的方法可以做到这一点,但应该使用以下聚合管道:

const ObjectId = require('mongoose').Types.ObjectId;
const res = await Message.aggregate(Message.aggregate([
{
    "$match": {
        // set the document id here
        _id: id
    }
},
{
    "$project": {
        "filteredMessages": {
            "$filter": {
                "input": {
                    "$map": {
                        "input": "$users",
                        "as": "user",
                        "in": {
                            "messages": {
                                "$filter": {
                                    "input": "$$user.messages",
                                    "as": "msg",
                                    "cond": {
                                // need to use ObjectId here, as the messages id's won't be plain string
                                        "$eq": ["$$msg._id", ObjectId("5f38f3574644e92d0cbbc5be")]
                                    }
                                }
                            }
                        }
                    },
                },
                "as": "filteredUser",
                "cond": {
                    "$and": [
                        {"$gt": [{"$size": "$$filteredUser.messages"}, 0]}
                    ]
                }
            }
        }
    }
}
]);

我在这里所做的是应用$filter和$map-$map是必需的,因为内部消息数组可能会因过滤而更改,而用户数组当然与消息数组更改时的条件不匹配。

欢迎使用此选项-您的代码/尝试会有所帮助。您使用的是mongoose还是普通节点mongodb驱动程序?我使用的是mongoose。我尝试了$and运算符,但仍然不起作用。像这样
Message.find({$and:[{{{u-id:id},{“users.{u-id”:userID}]})
你能为
消息添加你的模式定义吗。我是新来的。对不起,我的问题不好:(编辑后现在看起来好多了,但是你能解释一下它不起作用的意思吗?没有返回记录,有错误吗?
const ObjectId = require('mongoose').Types.ObjectId;
const res = await Message.aggregate(Message.aggregate([
{
    "$match": {
        // set the document id here
        _id: id
    }
},
{
    "$project": {
        "filteredMessages": {
            "$filter": {
                "input": {
                    "$map": {
                        "input": "$users",
                        "as": "user",
                        "in": {
                            "messages": {
                                "$filter": {
                                    "input": "$$user.messages",
                                    "as": "msg",
                                    "cond": {
                                // need to use ObjectId here, as the messages id's won't be plain string
                                        "$eq": ["$$msg._id", ObjectId("5f38f3574644e92d0cbbc5be")]
                                    }
                                }
                            }
                        }
                    },
                },
                "as": "filteredUser",
                "cond": {
                    "$and": [
                        {"$gt": [{"$size": "$$filteredUser.messages"}, 0]}
                    ]
                }
            }
        }
    }
}
]);