猫鼬查询:在数组中按 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 查找对象的主要内容,如果未能解决你的问题,请参考以下文章

如何在猫鼬模型内的数组中查找对象?

在 JavaScript 对象数组中按 id 查找对象

在猫鼬中按索引查找一个

用于查找唯一文档的猫鼬查询

向猫鼬查找查询结果添加字段

向猫鼬查找查询结果添加字段