所以在我的MongoDB数据库中,我有一个收集用户帖子的集合。
在该集合中,我有一个名为" likes"的集合,其中包含一些喜欢该帖子的用户的ID。在查询时我想将用户id传递给我的查询并在结果中有一个布尔值告诉我数组中是否存在id以查看用户是否已经喜欢该帖子。我理解这对于两个查询很容易,一个用于获取帖子,一个用于检查用户是否喜欢它,但我想找到最有效的方法来执行此操作。
例如,我的一个文档看起来像这样
{
_id: 24jef247jos991,
post: "Test Post",
likes: ["userid1", "userid2"]
}
当我从" userid1"查询时我想要回归
{
_id: 24jef247jos991,
post: "Test Post",
likes: ["userid1", "userid2"],
userLiked: true
}
但是,当我从let'来说," userid3"我想
{
_id: 24jef247jos991,
post: "Test Post",
likes: ["userid1", "userid2"],
userLiked: false
}
答案 0 :(得分:2)
您可以针对输入用户添加$addFields
阶段,检查每个文档likes
数组。
db.collection.aggregate( [
{
$addFields: {
"userLiked":{ $in: [ "userid1", "$likes" ] }
}
}
] )
答案 1 :(得分:1)
从MongoDB 3.4开始,您可以使用$in
聚合运算符来检查数组是否包含给定元素。您可以使用$addFields
运算符聚合运算符将新计算的值添加到文档中,而不显式包含其他字段。
db.collection.aggregate( [
{ "$addFields": { "userLiked": { "$in": [ "userid1", "$likes" ] } } }
])
在MongoDB 3.2中,您可以使用$setIsSubset
运算符和方括号[]
运算符来执行此操作。这种方法的缺点是您需要手动$project
文档中的所有字段。另外,$setIsSubset
运算符可以删除您的数组,这可能不是您想要的。
db.collection.aggregate([
{ "$project": {
"post": 1, "likes": 1,
"userLiked": { "$setIsSubset": [ [ "userid3" ], "$likes" ] }
}}
])
最后,如果您的mongod
版本为3.0或更早版本,则需要使用$literal
运算符而不是[]
运算符。