Mongodb - 针对键值等于 true 的对象数组进行聚合查询
Mongodb - aggregate query against array of objects where key value equals true
我有一个名为 items 的文档集合,每个文档中都有一个 field:value 这样:
{
likes: [
0: {
like: false
actor: { Object }
},
1: {
like: true
actor: { Object }
},
...
]
}
我需要 return 文档基于文档是否有任何喜欢。
likes 数组开始时为空。如果一个人喜欢某个项目,likes 数组将添加一个包含 like:true
和相关演员详细信息的新对象。如果同一个人删除了那个特定对象将被更新为 like:false
.
在查看结果时,一个人可以选择只查询喜欢或不喜欢的文档。
预期结果
With likes - 查询应该 return 仅具有 1 个或多个 likes 的文档。这被定义为:likes 数组必须至少有 1 个对象,其中 like:true 存在。
没有点赞 - 查询应该 return 只有 0 个点赞的文档。这被定义为:likes 数组必须为空或必须有 0 个对象 like:true 存在。
{ item: A, likes: [] }
{ item: B, likes: [{ like: false, actor: Beth }, { like: false: actor: John }] }
{ item: C, likes: [{ like: true, actor: Jeff }, { like: true: actor: Jess }] }
{ item: D, likes: [{ like: false, actor: Bob }] }
{ item: E, likes: [{ like: false, actor: AJ }, { like: true: actor: Raluca }] }
{ item: F, likes: [{ like: true, actor: Craig }] }
喜欢 - 查询应该 return 项目 C + E + F
没有喜欢 - 查询应该 return items A + B + D
我怎样才能做到这一点?
上次尝试
当前尝试的逻辑失败,因为它只检查数组的长度。如果用户立即删除了一个赞,returns 错误的结果。
matchQueryConditions.$and.push({
$expr: { [searchOptions.withLikes === true ? '$gt' : '$eq']: [{ $size: '$likes' }, 0] },
});
看了无数次 docs 终于点击了,答案相对简单。以下调整修复了它:
matchQueryConditions.$and.push({
'likes.like' : {
[searchOptions.withLikes === true ? '$eq' : '$ne']: true
}
});
我有一个名为 items 的文档集合,每个文档中都有一个 field:value 这样:
{
likes: [
0: {
like: false
actor: { Object }
},
1: {
like: true
actor: { Object }
},
...
]
}
我需要 return 文档基于文档是否有任何喜欢。
likes 数组开始时为空。如果一个人喜欢某个项目,likes 数组将添加一个包含 like:true
和相关演员详细信息的新对象。如果同一个人删除了那个特定对象将被更新为 like:false
.
在查看结果时,一个人可以选择只查询喜欢或不喜欢的文档。
预期结果
With likes - 查询应该 return 仅具有 1 个或多个 likes 的文档。这被定义为:likes 数组必须至少有 1 个对象,其中 like:true 存在。
没有点赞 - 查询应该 return 只有 0 个点赞的文档。这被定义为:likes 数组必须为空或必须有 0 个对象 like:true 存在。
{ item: A, likes: [] }
{ item: B, likes: [{ like: false, actor: Beth }, { like: false: actor: John }] }
{ item: C, likes: [{ like: true, actor: Jeff }, { like: true: actor: Jess }] }
{ item: D, likes: [{ like: false, actor: Bob }] }
{ item: E, likes: [{ like: false, actor: AJ }, { like: true: actor: Raluca }] }
{ item: F, likes: [{ like: true, actor: Craig }] }
喜欢 - 查询应该 return 项目 C + E + F
没有喜欢 - 查询应该 return items A + B + D
我怎样才能做到这一点?
上次尝试
当前尝试的逻辑失败,因为它只检查数组的长度。如果用户立即删除了一个赞,returns 错误的结果。
matchQueryConditions.$and.push({
$expr: { [searchOptions.withLikes === true ? '$gt' : '$eq']: [{ $size: '$likes' }, 0] },
});
看了无数次 docs 终于点击了,答案相对简单。以下调整修复了它:
matchQueryConditions.$and.push({
'likes.like' : {
[searchOptions.withLikes === true ? '$eq' : '$ne']: true
}
});