在查询中苦苦挣扎,我有一个用户集合:
{
"_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数组,而不是对象数组,那应该没问题。
任何帮助将不胜感激。 谢谢,
答案 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
。