javascript - 如何通过 isDisliked 字段为 false 的位置填充用户 ID
问题描述
我需要通过 isDisliked 为 false 来填充来自 likeBy 的用户,请查找文档架构。
我正在使用下面的查询,但无法填充用户。使用下面的查询,
let likedBy = await StoryComment.aggregate([{"$match":{"_id": exportLib.ObjectId(currentPost)}}, {"$match":{"comments.likedBy.isDisliked": false}}]);
得到如下输出,
[
{
_id: 60fd5b5336a2780754021ce0,
comments: { reply: [], likedBy: [Array], report: [] },
isDeleted: false,
isArchived: false,
storyId: 60fa45be78e0cc052760922f,
comment: 'New to this place bro',
userId: 60e7ce8e0812ba086dc16074,
createdAt: 2021-07-25T12:38:43.427Z,
updatedAt: 2021-07-25T13:46:28.728Z,
__v: 0
}
]
预期输出:
[
{
isDisliked: false,
_id: 60fd5d08ddf94d07d0da9d57,
likedBy: 60e7ce8e0812ba086dc16074
},
{
isDisliked: false,
_id: 60fd6b34fa5bdf06a743fc3c,
likedBy: 60df550da01794081fc83762
}
]
需要有关 likeBy 位置的用户详细信息(就像我们简单地使用填充一样),这只是 likeBy 数组的结构化版本。
请在此处找到架构:
const storyComments = new mongoose.Schema(
{
storyId: { type: schema.Types.ObjectId, ref: "stories" },
comment: { type: String },
userId: { type: schema.Types.ObjectId, ref: "Users" },
comments: {
reply: [{
comment: { type: String },
userId: { type: schema.Types.ObjectId, ref: "Users" },
}],
likedBy : [{
likedBy: { type: schema.Types.ObjectId, ref: "Users" },
isDisliked: { type: Boolean, default: false}
}],
report : [{
reportedBy: { type: schema.Types.ObjectId, ref: "Users" },
reason: { type: String },
isReported: { type: Boolean, default: false },
isAdminApproved: { type: Boolean, default: false },
isCreatorApproved: { type: Boolean, default: false },
creatorEmail: { type: String },
tokenToApprove: { type: String, default: ""}
}]
},
isDeleted: { type: Boolean, default: false },
isArchived: { type: Boolean, default: false }
},
{
timestamps: true,
}
);
请帮我解决这个问题。谢谢
解决方案
你可以试试这个来填充用户
const story = StoryComment.find({
"_id": exportLib.ObjectId(currentPost),
"comments.likedBy": {
"$elemMatch": {
"isDisliked": true
}
}
},
{
"comments.likedBy.$": 1
})
.populate('Users')
.exec(function (err, person) {
if (err) return handleError(err);
console.log(person);
});
这是官方文档的链接:参考 childeren
或者
如果你想通过aggregate
管道来做,你可以试试这个代码
db.story.aggregate([
{
"$match": {
"_id": ObjectId("5a934e000102030405000005")
}
},
{
"$unwind": "$comments.likedBy"
},
{
"$match": {
"comments.likedBy.isDisliked": false
}
},
{
"$project": {
likedBy: "$comments.likedBy.likedBy"
}
},
{
"$lookup": {
"from": "users",
"localField": "likedBy",
"foreignField": "_id",
"as": "user"
}
},
{
"$unwind": "$user"
},
{
$replaceRoot: {
newRoot: "$user"
}
}
])
这是测试用例的游乐场的链接:Mongo Playground
推荐阅读
- r - 删除 R 中的字符串模式,同时保留字符串的其余部分
- java - 在 Servlet 中出现 NullPointerException
- amazon-web-services - Istio ServiceEntry 用于将多个外部数据库连接到同一个数据库
- visual-studio-2015 - Visual Studio 2015 上的集成帐户项目 - 添加生成的项目选项卡以从端点、wsdl 等创建架构
- .net-core - 避免在连接到同一 SQL 服务器、.net Core 上的多个数据库时进行分布式事务
- wordpress - Wordpress Captcha v2 insivisble 不工作 - 橙色错误 - js 错误
- c# - SetCustomAttribute 方法不会将指定的属性添加到类中
- objective-c - 在 Objective C 中用关联值表示枚举
- python - 从 cmd 启动 conda 提示
- angularjs - 将布尔值传递给指令