- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个集合中的文档,如下所示:
[
{
userId: 1,
itemsIds: [399957190, 366369952],
hash: '85e765840b1cd3c413404cdf6b8fb2a4'
},
{
userId: 2,
itemsIds: [349551151, 366369952],
hash: 'a28fa334515749b1b13fcd2183edb8de'
},
{
userId: 3,
itemsIds: [399957190, 366369952],
hash: '85e765840b1cd3c413404cdf6b8fb2a4'
}
]
这些是用户,他们的列表中有最喜欢的项目。我想要一个用户的列表给其他人,看看他们是否相等。如果是,我想在我的代码中将它们标记为一对并执行一些操作。
在上面的示例中,用户 1 和 3 具有相同的收藏夹列表。我如何找到一个包含我列出的值的数组的用户?
最佳答案
这里有几个“非常有用的案例”,实际上尝试在数组内容上创建“唯一哈希”实际上是在“妨碍”可以轻松解决的无数问题。
例如,如果您从所提供的示例中获取“用户 1”,并认为您已经加载了该数据,并且想通过匹配的“itemsIds”从当前用户对象中找到“那些与我共同的人” ,那么有两种简单的查询方式:
查找“完全”相同:您要在此处检查其他用户数据以查看具有相同“完全”兴趣的用户。这是 $all
的简单且“无序”用法查询运算符:
db.collection.find({
"itemsIds": { "$all": [399957190, 366369952] },
"userId": { "$ne": 1 }
})
这将返回“用户 3”,因为他们是具有“两个”公共(public)“itemsIds”条目的用户。顺序在这里并不重要,因为它总是以任何顺序匹配,只要它们都在那里。这是另一种形式的 $and
作为查询参数。
找到与我“相似”的共同点”:这基本上是在问“你有没有相同的东西?”。为此你可以使用 $in
查询运算符。如果满足指定条件中的“任一”,它将匹配:
db.collection.find({
"itemsIds": { "$in": [399957190, 366369952] },
"userId": { "$ne": 1 }
})
在这种情况下,“用户 2”和“用户 3”“两者”都将匹配,因为它们“至少”共享指定的“一个”条件,这意味着与查询的源数据。
这实际上是 $or
查询运算符的另一种形式,就像以前一样,在给定要应用的条件下,以这种方式编写更加简单和简洁。
在某些情况下,您可能希望在没有基础“用户”的情况下找到“共同点”的事物。那么,您如何判断“用户 1”和“用户 2”共享相同的“itemIds”,或者实际上不同的用户可能单独共享相同的“itemIds”值,但他们是谁?
获取精确匹配:当然是您查看“itemsIds”值和 $group
的地方他们在一起。一般来说,这里的“顺序很重要”,所以最好让它们“预先订购”,并始终如一地使它变得如此简单:
db.collection.aggregate([
{ "$group": {
"_id": "$itemsIds",
"common": { "$push": "$userId" }
}}
])
只要订单已经存在,这就是它真正的全部。如果没有,那么您可以做一个稍长的缠绕形式来进行“排序”,但生成“哈希”也是如此:
db.collection.aggregate([
{ "$unwind": "$itemsIds" },
{ "$sort": { "_id": 1, "itemsIds": 1 } },
{ "$group": {
"_id": "$_id",
"userId": { "$first": "$userId" },
"itemsIds": { "$push": "$itemsIds" }
}},
{ "$group": {
"_id": "$itemsIds",
"common": { "$push": "$userId" }
}}
])
不是“ super ”性能,但它说明了为什么您总是在添加数组条目时保持有序。这是一个非常简单的过程。
从“用户”到“项目”:这是另一个简单的抽象过程,“分解”$unwind
下的数组,然后基本上分组回来:
db.collection.aggregate([
{ "$unwind": "$itemsIds" },
{ "$group": {
"_id": "$itemsIds",
"users": { "$addToSet": "$userId" }
}}
])
同样,这只是一个简单的 $addToSet
分组聚合器完成这项工作并为每个“itemsIds”值收集“不同的 userId”值。
这些都是基本的解决方案,我可以继续“设置交叉点”等等,但这是“入门”。
不要试图计算“散列”,MongoDB 有一个很好的“武器库”来匹配条目。使用它并“滥用它”,直到它坏掉。然后更加努力。
关于javascript - 如何查找与查询中具有完全相同数组条目的文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32435869/
1。 Set 的 parallelStream 没有使用足够的线程。 Java8 parallelStream 不能完全并行工作。在我的计算机中,当任务数小于处理器数时,java8 集的 parall
我想将位置发送到 Google Geocoding API,因此我想用 + 替换文本中的任何空格或逗号(因为可以接收)。 例如,所有这些样本应返回 Glentworth+Ireland: Glentw
所以我需要为将要上传的图像文件生成较小的预览,并且我必须在每个文件名的末尾附加“_preview”。 目前我正在这样做: uploadFile.map((file) => { if (fi
我们可以用参数定义类型同义词,这在与实际类型一起使用时效果很好: type MyType t = t String String data Test a b = Test a b f :: MyTyp
给定一个包含一些 TGraphic 后代的 Delphi TPicture,我需要计算像素颜色和不透明度。我认为我必须为每个类提供不同的实现,并且我认为我已经涵盖了 TPngImage。 32 位位图
我正在调试 Powershell 项目。我正在使用 Import-Module 从我的 C# dll 加载 PS 模块,一切正常。尽管调用 Remove-Module 并不会完全卸载模块,因为 DLL
有没有办法在ElasticSearch中要求完整(尽管不一定精确)匹配? 例如,如果一个字段具有术语"I am a little teapot short and stout",我想匹配" i am
我正在尝试根据日期范围连接两个表。 表A格式为: ID CAT DATE_START DATE_END 1 10 2018-01-01 2020-12-31 2
我最近加入了一家公司,在分析他们的环境时,我注意到 SharePoint web.config 的信任级别设置为“完全”。我知道这绝对是一个糟糕的做法,并且希望 stackoverflow 社区能够帮
我构建了一个完全依赖 AJAX 的 php/js 应用程序,因此没有任何内容是静态的。 我正在尝试找到一种方法来转换基于内容的广告,该广告使用 AJAX 交付的内容作为关键字。 Google 的 Ad
我正在尝试根据日期范围连接两个表。 表A格式为: ID CAT DATE_START DATE_END 1 10 2018-01-01 2020-12-31 2
我熟悉 FileSystemWatcher 类,并使用它进行了测试,或者我使用快速循环进行了测试,并在目录中列出了类型文件的目录列表。在这种特殊情况下,它们是 zip 压缩的 SDF 文件,我需要解压
按照 Disqus 上的教程进行操作时,评论框不会呈现。从 disqus 上找到的管理员看来,它的设置似乎是正确的。 var disqus_config = function () { this
是否可以使用 Cython 将 Python 3 应用程序完全编译/链接为可执行格式(当然假设所有使用的模块都是 cythonable)。 我在 Linux 下工作,我希望获得一个依赖性尽可能小的 E
我有一个 C# 控制台应用程序,而不是运行预构建步骤(以获取 NuGet 包)。 当我调试这个时,我想传入一个参数并显示控制台。当我不调试它时,我不想看到它。我什至不希望它在那里闪烁一秒钟。 我找到了
我在 n 个节点上有一个完整的 19 元树。我标记所有具有以下属性的节点,即它们的所有非根祖先都是最年长或最小的 child (包括根)。我必须为标记节点的数量给出一个渐近界限。 我注意到 第一层有一
我正在阅读一篇关于 Java Volatile 关键字的文章,遇到了一些问题。 click here public class MyClass { private int years;
一本书中写道——“如果问题 A 是 NP-Complete,则存在解决 A 的非确定性多项式时间算法”。但据我所知,"is"——NP 完全问题的答案可以在多项式时间内“验证”。我真的很困惑。能否使用非
考虑以下问题: 有N个硬币,编号为1到N。 你看不到它们,但是给出了关于它们的 M 个事实,形式如下: struct Fact { set positions int num_head
我想制作一个包装数字类型的类型(并提供额外的功能)。 此外,我需要数字和包装器可以隐式转换彼此。 到目前为止我有: template struct Wrapper { T value;
我是一名优秀的程序员,十分优秀!