猫鼬查询:在数组中按 id 查找对象
Posted
技术标签:
【中文标题】猫鼬查询:在数组中按 id 查找对象【英文标题】:mongoose query: find an object by id in an array 【发布时间】:2017-03-28 13:40:19 【问题描述】:如何在此架构中按 id 找到图像。我有用户的 ID 和我正在寻找的图像的 ID。最好的方法是什么?在这种情况下,所有图像都具有不同的 id,或者它们是否具有相同的 id,因为它们不属于同一个用户?
我的架构如下所示:
var userSchema = new Schema(
local:
email: String,
password: String
,
facebook:
id: String,
token: String,
email: String,
name: String
,
name: String,
about: String,
images: [
id: Schema.ObjectId,
link: String,
main: Boolean
]
);
【问题讨论】:
您是对整个对象感兴趣还是只对具有指定 id 的图像感兴趣? 我更喜欢一个完整的对象,其中只有一个具有传递 id 的图像。 【参考方案1】:userSchema .find(facebook.id: "some ID", "images.id": $in: [ id1, id2, ...idn]
由于图像在文档中,您可以拥有相同的 ID,但是每次查询时都应记住,您发送一些其他参数,例如 facebook.id 或 facebook.email 以及图像 ID 以检索它们。否则,您最终会得到所有可能无关紧要的信息,因为您决定为图像保留相同的 ID。
【讨论】:
【参考方案2】:当您对完整对象感兴趣时,它是一个简单的find
:
.find("facebook.id":"<id>", "images.id":<image-id>)
我认为没有办法减少结果中的图像数组。
要更新图像数组中的单个元素,您可以使用:
.update("facebook.id":"<id>", "images.id":<image-id>, $set : "images.$.main" :false );
【讨论】:
这正是我的问题。我只需要更新该图像中的一个字段,并且不知道如何获取该图像。还有其他的硬伤吗?感谢您的帮助。【参考方案3】:tl;博士
我为此苦苦挣扎,并想出了一个解决方案。像你一样,我试图通过_id
查询一个深度嵌套的对象,但结果一直是空的。直到我进行了一些类型检查,我才意识到我从前端获得的 id
值虽然直接由 mongoose 提供,但实际上是 String
而不是 Object
。
我意识到这个问题之前已经部分回答了,但是那个人的解决方案对我不起作用,并且对答案的评论告诉我你想更新你查询的特定图像,这正是我正在尝试的去做。
解决办法
为了通过 _id
值从嵌套数组中选择一个对象,首先您必须安装 npm 包 bson-objectid
并使用提供的方法将您的字符串转换为查询中的 objectId
.
在您的终端中:
npm i bson-objectid
在您的代码中:
const ObjectId = require('bson-objectid')
userSchema.findOneAndUpdate(
"facebook.id": <user-id>, "images._id": ObjectId(<image-id>) ,
"$set": "images.$.main": false ,
new: true , // an extra options parameter that returns the mutated document
(err, user) =>
if (err)
handleErr(err)
else
console.log(user)
// do something with new user info
)
【讨论】:
以上是关于猫鼬查询:在数组中按 id 查找对象的主要内容,如果未能解决你的问题,请参考以下文章