node.js - 使用 MongoDB 4.0 查找函数返回匹配元素

标签 node.js mongodb nested find

Mongodb 返回嵌套数组中的非匹配元素

这是我的数据库示例:

  const users = [{
        'username':'jack',
        'songs':[{
            'song':'Another Love',
            'likes':false
        }, {
            'song':"i'm into you",
            'likes': true
        }]
    }, {
        'username':'Stromae',
        'songs':[{
            'song':'Take me to church',
            'likes':false
        }, {
            'song':"Habits",
            'likes': true
        }]
    }];

我正在尝试查找以下行:

 const query = {'username':'Stromae' , 'songs.song':'Take me to church','songs.likes':true};
 const result = await usersTable.find(query).project({'songs.$':1}).toArray();

如您所见,我正试图找到一个名为“Stromae”并且有一首“带我去教堂”歌曲但他不喜欢这首歌的用户。

我期望结果为空,而结果是:

{ _id: 5d302809e734acbc5ffa2a8f,
  songs: [ { song: 'Take me to church', likes: false } ] }

正如您从结果中看到的那样,它忽略了我需要“喜欢”字段为真。

最佳答案

根据我的理解,您正在尝试匹配满足“歌曲”和“喜欢”两个字段的条件的“歌曲”数组中的数据。但是您没有提供逻辑,例如检查同一数组元素的两个字段。这就是为什么它要检查整个“歌曲”数组中的这个字段。

要检查单个数组元素的条件,您可以使用 $elemMatch并检查两个条件是否满足,使用 $and运营商。

您可以将 Mongo 查询用作:

db.usersTable.find({
  "username": "Stromae",
  songs: {
    $elemMatch: {
      $and: [
        {
          "song": "Take me to church"
        },
        {
          "likes": true
        }
      ]
    }
  }
})

只需更新您的“查找”查询,您可能会得到所需的结果。

关于node.js - 使用 MongoDB 4.0 查找函数返回匹配元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57090558/

相关文章:

c# - TCP 服务器仅适用于 localhost 方案

java - 将文档从一个集合移动到另一个集合会覆盖该文档

node.js - Mongoose findOneAndUpdate - 使用另一个字段更新一个字段

python:在嵌套字典中查找匹配值

python - 理解python中的嵌套 yield /返回

javascript - JS 墙上的又一 block 砖

jquery - Node.js - 使用 json.stringify 时主体困惑

node.js - 为什么 sequelize 在我进行查询时尝试选择一个额外的列

mongodb - Mongoose 为所有嵌套对象添加 _id

arrays - 无法使用 Mongoose 将嵌套 JSON 数组存储到 MongoDB