mongoose 查询:通过数组中的 id 查找对象
mongoose query: find an object by id in an array
如何在此架构中按 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
}]
});
userSchema .find({facebook.id: "some ID",{ "images.id": { $in: [ id1, id2, ...idn] }}
由于图像在文档中,您可以使用相同的 ID,但是每次查询时,请记住您将一些其他参数(例如 facebook.id 或 facebook.email 与图像 ID 一起发送到取回它们。否则你最终会得到所有可能无关紧要的东西,只是因为你决定为图像保留相同的 ID。
当您对完整对象感兴趣时,它很简单 find
:
.find({"facebook.id":"<id>", "images.id":<image-id>})
我认为没有办法减少结果中的图像数组。
要更新图像数组中的单个元素,您可以使用:
.update({"facebook.id":"<id>", "images.id":<image-id>}, {$set : {"images.$.main" :false} } );
tl;博士
我为此苦苦挣扎并想出了一个解决方案。像你一样,我试图通过 _id
查询一个深度嵌套的对象,但我一直没有得到结果。直到我做了一些类型检查,我才意识到我从前端获得的 id
值,虽然由 mongoose 直接提供,但实际上是 String
而不是 Object
.
我知道这个问题之前已经部分回答了,但是那个人的解决方案对我不起作用,答案的评论告诉我你想更新你查询的特定图像,这正是我正在尝试做。
解决方案
为了通过 _id
值 select 嵌套数组中的对象,首先您必须安装 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 查找图像。我有用户的 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
}]
});
userSchema .find({facebook.id: "some ID",{ "images.id": { $in: [ id1, id2, ...idn] }}
由于图像在文档中,您可以使用相同的 ID,但是每次查询时,请记住您将一些其他参数(例如 facebook.id 或 facebook.email 与图像 ID 一起发送到取回它们。否则你最终会得到所有可能无关紧要的东西,只是因为你决定为图像保留相同的 ID。
当您对完整对象感兴趣时,它很简单 find
:
.find({"facebook.id":"<id>", "images.id":<image-id>})
我认为没有办法减少结果中的图像数组。
要更新图像数组中的单个元素,您可以使用:
.update({"facebook.id":"<id>", "images.id":<image-id>}, {$set : {"images.$.main" :false} } );
tl;博士
我为此苦苦挣扎并想出了一个解决方案。像你一样,我试图通过 _id
查询一个深度嵌套的对象,但我一直没有得到结果。直到我做了一些类型检查,我才意识到我从前端获得的 id
值,虽然由 mongoose 直接提供,但实际上是 String
而不是 Object
.
我知道这个问题之前已经部分回答了,但是那个人的解决方案对我不起作用,答案的评论告诉我你想更新你查询的特定图像,这正是我正在尝试做。
解决方案
为了通过 _id
值 select 嵌套数组中的对象,首先您必须安装 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
}
)