因此,在我的MongoDB数据库中,我有一个包含用户帖子的集合。
在该集合中,我有一个名为“喜好”的集合,它包含了喜欢该帖子的用户的ids数组。在查询时,我希望将一个用户id传递给我的查询,并在结果中包含一个布尔值,告诉我该id是否存在于数组中,以查看用户是否已经喜欢这个帖子。我知道这很容易通过两个查询来实现,一个是获取帖子,另一个是检查用户是否喜欢它,但是我想找到最有效的方法来完成这个任务。
例如,我的一个文档如下所示
{
_id: 24jef247jos991,
post: "Test Post",
likes: ["userid1", "userid2"]
}当我从"userid1“查询时,我希望返回
{
_id: 24jef247jos991,
post: "Test Post",
likes: ["userid1", "userid2"],
userLiked: true
}但是当我从"userid3“中查询时,我想
{
_id: 24jef247jos991,
post: "Test Post",
likes: ["userid1", "userid2"],
userLiked: false
}发布于 2017-03-19 23:16:35
您可以添加$addFields阶段,根据输入用户检查每个文档likes数组。
db.collection.aggregate( [
{
$addFields: {
"userLiked":{ $in: [ "userid1", "$likes" ] }
}
}
] )发布于 2017-03-20 10:09:53
从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运算符而不是[]运算符。
https://stackoverflow.com/questions/42893212
复制相似问题