我在这里有我的示例 userSchema:
{
"_id": objectId("6092076ba811e50b565497ec"),
"username": "test@gmail.com",
"address_book": [{
"_id": objectId("6092b1120f7e370b954a2708"),
"address": "address1",
"address2": "address2",
}, {
"_id": objectId("6093edcb88796b0a5eba19a3"),
"address": "test1",
"address2": "test2",
}]
}
我可以通过以下方式找到用户吗
objectId("6092076ba811e50b565497ec")
和 address_book._id object("6093edcb88796b0a5eba19a3")
它只返回我选择的 address_book
吗?我的预期回报数据应该是这样的
{
"_id": objectId("6092076ba811e50b565497ec"),
"username": "test@gmail.com",
"address_book": {
"_id": objectId("6093edcb88796b0a5eba19a3"),
"address": "test1",
"address2": "test2",
}
}
这是我的示例函数
let user = [];
await User.findOne({
_id: id,
"address_book._id": address_id,
})
.then((result) => {
console.log(result);
user = result;
})
.catch((err) => console.log(err));
return user;
有了这个,我就得到了所有的地址簿
还有是否可以通过address_book._id
实现updateOrCreate函数?
提前致谢。
答案 0 :(得分:1)
elemMatch 根据我的说法是你正在寻找的。 elemMatch 用于投影,而不仅仅是匹配。
db.<collection name>.find({
< search using elem match >
}, {
games: {
$elemMatch: {
//put your projection piece here, whatever selective what you want, check the example on documentation
score: {
$gt: 5
}
}
},
//anything else that you would want apart from within array projection
})
更新:
数据
[
{
"_id": "6092076ba811e50b565497ec",
"username": "test@gmail.com",
"address_book": [
{
"_id": "6092b1120f7e370b954a2708",
"address": "address1",
"address2": "address2",
},
{
"_id": "6093edcb88796b0a5eba19a3",
"address": "test1",
"address2": "test2",
}
]
}
]
命令
db.collection.find({},
{
address_book: {
$elemMatch: {
address: "test1"
}
}
})
结果
[
{
"_id": "6092076ba811e50b565497ec",
"address_book": [
{
"_id": "6093edcb88796b0a5eba19a3",
"address": "test1",
"address2": "test2"
}
]
}
]
答案 1 :(得分:1)
从 MongoDB 4.4 开始,您可以在 find 方法中使用聚合运算符,
$filter
迭代 address_book
数组的循环并匹配 _id
条件$first
从上面的过滤结果中选择第一个元素await User.findOne({
_id: id,
"address_book._id": address_id
},
{
username: 1,
address_book: {
$first: {
$filter: {
input: "$address_book",
cond: { $eq: ["$$this._id", mongoose.Types.ObjectId(address_id)] }
}
}
}
})