gpt4 book ai didi

javascript - 如何查找与查询中具有完全相同数组条目的文档

转载 作者:可可西里 更新时间:2023-11-01 09:56:37 25 4
gpt4 key购买 nike

我有一个集合中的文档,如下所示:

[
{
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”从当前用户对象中找到“那些与我共同的人” ,那么有两种简单的查询方式:

  1. 查找“完全”相同:您要在此处检查其他用户数据以查看具有相同“完全”兴趣的用户。这是 $all 的简单且“无序”用法查询运算符:

    db.collection.find({ 
    "itemsIds": { "$all": [399957190, 366369952] },
    "userId": { "$ne": 1 }
    })

    这将返回“用户 3”,因为他们是具有“两个”公共(public)“itemsIds”条目的用户。顺序在这里并不重要,因为它总是以任何顺序匹配,只要它们都在那里。这是另一种形式的 $and 作为查询参数。

  2. 找到与我“相似”的共同点”:这基本上是在问“你有没有相同的东西?”。为此你可以使用 $in 查询运算符。如果满足指定条件中的“任一”,它将匹配:

    db.collection.find({ 
    "itemsIds": { "$in": [399957190, 366369952] },
    "userId": { "$ne": 1 }
    })

    在这种情况下,“用户 2”和“用户 3”“两者”都将匹配,因为它们“至少”共享指定的“一个”条件,这意味着与查询的源数据。

    这实际上是 $or 查询运算符的另一种形式,就像以前一样,在给定要应用的条件下,以这种方式编写更加简单和简洁。

寻找共同的“事物”

在某些情况下,您可能希望在没有基础“用户”的情况下找到“共同点”的事物。那么,您如何判断“用户 1”和“用户 2”共享相同的“itemIds”,或者实际上不同的用户可能单独共享相同的“itemIds”值,但他们是谁?

  1. 获取精确匹配:当然是您查看“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 ”性能,但它说明了为什么您总是在添加数组条目时保持有序。这是一个非常简单的过程。

  2. 从“用户”到“项目”:这是另一个简单的抽象过程,“分解”$unwind 下的数组,然后基本上分组回来:

    db.collection.aggregate([
    { "$unwind": "$itemsIds" },
    { "$group": {
    "_id": "$itemsIds",
    "users": { "$addToSet": "$userId" }
    }}
    ])

    同样,这只是一个简单的 $addToSet 分组聚合器完成这项工作并为每个“itemsIds”值收集“不同的 userId”值。

这些都是基本的解决方案,我可以继续“设置交叉点”等等,但这是“入门”。

不要试图计算“散列”,MongoDB 有一个很好的“武器库”来匹配条目。使用它并“滥用它”,直到它坏掉。然后更加努力。

关于javascript - 如何查找与查询中具有完全相同数组条目的文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32435869/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com