MongoDB,Mongoose找到所有_id等于数组中对象键的地方

时间:2019-03-14 10:06:00

标签: node.js mongodb mongoose

在查询中苦苦挣扎,我有一个用户集合:

{
    "_id": "5c87bda25fdaasdf00171001e1",
    "name": "UserTwo Name",
    "email": "email2@example.com"
},{
    "_id": "5c87bda25fda8b00171001e1",
    "name": "User Name",
    "email": "email@example.com"
}

我还有一个包含_userId键的对象数组。我需要让所有用户的_id等于数组中_userId的值的用户。

[
    {_userId: "5c87bda25fda8b00171001e1"},
    {_userId: "5c87bda25fdaasdf00171001e1"},
]

到目前为止,我有:

User.find(
        {
            _id: { $in: req.body.users }
        }
    )

如果req.body.users只是一个ID数组,而不是对象数组,那应该没问题。

任何帮助将不胜感激。 谢谢,

2 个答案:

答案 0 :(得分:3)

您应该像这样修改查询:

 User.find({
            _id: { $in: req.body.users.map(user => ObjectId(user._userId) }
 });

您需要将_userId字符串转换为ObjectId。这将通过map函数来完成。

答案 1 :(得分:0)

您必须旋转数组

[
    {_userId: "5c87bda25fda8b00171001e1"},
    {_userId: "5c87bda25fdaasdf00171001e1"},
]

进入

[
    "5c87bda25fda8b00171001e1",
    "5c87bda25fdaasdf00171001e1",
]

那我们该怎么做呢?


示例1 :使用Array.map遍历指定数组,调用一个函数,然后创建一个新数组,其值是它调用的函数返回的值。

console.log([{
  _userId: "5c87bda25fda8b00171001e1",
},
{
  _userId: "5c87bda25fdaasdf00171001e1",
},
].map(x => x._userId));


示例2 :使用众所周知的for循环并自己创建数组

const arr = [{
  _userId: "5c87bda25fda8b00171001e1"
}, {
  _userId: "5c87bda25fdasdf0017101e1"
}, ];

const newArr = [];

for (let i = 0; i < arr.length; i += 1) {
  newArr.push(arr[i]._userId);
}

console.log(newArr);


PS :如@Ivan Vasiljevic所建议的那样,在构建id数组时,可以将string变成ObjectID对象。使用mongoose.find并不是强制性的;可以使用mongoose.aggregate