MongoDB查询-与javascript数组连接

MongoDB查询-与javascript数组连接,mongodb,Mongodb,我有一个用户集合,如下所示 { { _id: ObjectId(...), services: {facebook: {id: 1}} }, { _id: ObjectId(...), services: {facebook: {id: 2}} }, ... } 此外,我还有以下JavaScript数组: [ {name: "Alice", id: 1}, {name: "B

我有一个用户集合,如下所示

{
    {
        _id: ObjectId(...),
        services: {facebook: {id: 1}}
    },
    {
        _id: ObjectId(...),
        services: {facebook: {id: 2}}
    },
    ...
}
此外,我还有以下JavaScript数组:

[
    {name: "Alice", id: 1},
    {name: "Bob", id: 3},
    ...
]

我想查找其id存在于数组中的所有用户,但我找不到“进入”JavaScript数组的方法。

首先将JavaScript数组转换为仅包含原始id的数组:

var yourArray = [ 1, 3 ];
然后尝试这个查询

db.yourCollection.find({ services.facebook.id : { $in : yourArray } });
不幸的是,没有好办法让数据库将本地数组(name字段)中的信息与数据库返回的数据连接起来。所以你必须自己做这件事。对返回的文档执行for循环,并通过查找数组中的services.facebook.id字段查找真实姓名

顺便说一句:与SQL数据库中的做法相反,在MongoDB中通常应该避免使用人工外键(或一般的外键),因为MongoDB的构建并不像关系数据库那样能够处理引用。在文档中嵌入数据,而不是将其作为不同的文档引用,通常是一个不错的选择。“所有数据都必须规范化”的教条不适用于像MongoDB这样的文档数据库,而适用于关系数据库。

您可以使用该函数从源数组中提取
id
值,然后在
find
中使用带有运算符的值,如下所示:

var-arr=[
{姓名:“爱丽丝”,id:1},
{姓名:“鲍勃”,id:3},
...
];
find({'services.facebook.id':{$in:arr.map(函数(e){returne e.id;}}}});

出于好奇,我会问smtg。如果id字段上有索引,该解决方案会使用索引吗?或者这将执行类似于$where查询的操作,而$where查询不能使用索引?@cubbuk是的,它将使用索引。
arr.map
调用是在shell中进行的,因此mongo只看到生成的ID数组。谢谢,我以前知道array.map,但我一直在寻找迭代次数较少的高性能解决方案。但是很明显,array.map是唯一的方法…谢谢你的回答。当然,我知道MongoDB数据无法规范化,它不在我的应用程序中,但由于我的MongoDB中有我的用户集合,并从另一个系统(在我的例子中是Facebook)接收阵列,我需要执行“加入”(这是一个与MongoDB相关的错误选择,但我无法想出更好的术语)。