Node.js Mongoose如何在数组中查找对象
我试过几种方法,但都不管用。如何从2数组中查找对象。我的尝试: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({
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]}
]
}
}
}
}
}
]);