Mongoose查询:在数组中通过ID查找对象

9

在这个Schema中,我该如何通过id找到一张图片。我有用户的id和我正在寻找的图片的id。最好的方法是什么?在这种情况下,所有图片的id是否都不同,还是可能会有相同的id,因为它们属于不同的用户?

我的Schema看起来像这样:

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的图像感兴趣? - adebasi
我更喜欢一个完整的对象,其中只包含具有传递的ID的一个图像。 - user3888540
3个回答

11

当您对完整对象感兴趣时,可以使用简单的 find 方法:

.find({"facebook.id":"<id>", "images.id":<image-id>})

我认为没有办法在结果中减少图像数组。

要更新图像数组中的单个元素,您可以使用以下方法:

.update({"facebook.id":"<id>", "images.id":<image-id>}, {$set : {"images.$.main" :false} } );

那正是我的问题。我需要更新那个图片中的某一个字段,但不知道如何获取到该图片。还有其他想法吗?非常感谢帮助。 - user3888540

2
userSchema .find({facebook.id: "some ID",{ "images.id": { $in: [ id1, id2, ...idn] }}

由于图片在文档内,因此您可以拥有相同的ID,但是每次查询时,您应该记住发送一些其他参数(例如facebook.id或facebook.email),以及图像ID以检索它们。否则,您最终会获取所有可能与您决定保留相同ID的图像无关的内容。


0

简短概述

我曾经遇到过这个问题,并找到了解决方案。和你一样,我试图通过_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
        }
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接