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
        }
)