I have 2 collections:
Apartments:

{_id: '1', address: 'Street 1'},
{_id: '2', address: 'Street 2'},
{_id: '3', address: 'Street 3'},
{_id: '4', address: 'Street 4'}

和用户:

{_id: '1', name: 'User 1', favorites: ['1', '3']},
{_id: '2', name: 'User 2', favorites: ['2', '3', '4']},
{_id: '3', name: 'User 3', favorites: []}

我需要做一个查询,返回公寓的详细信息以及它被添加为用户最喜欢的次数计数.所以,大概是这样的:

{_id: '1', address: 'Street 1', favoritesCount: 1},
{_id: '2', address: 'Street 2', favoritesCount: 1},
{_id: '3', address: 'Street 3', favoritesCount: 2},
{_id: '4', address: 'Street 4', favoritesCount: 1}

因此,除了默认公寓的详细信息之外,我还需要有一个"FavoritesCount"字段,该字段查找每个公寓的favorites个用户数组中包含的计数.

推荐答案

也许是这样的:

db.Apartments.aggregate([
{
"$lookup": {
  "from": "Users",
  "localField": "_id",
  "foreignField": "favorites",
  "as": "favoritesCount"
  }
 },
 {
 "$addFields": {
  "favoritesCount": {
    $size: "$favoritesCount"
   }
  }
 }
])

解释:

  1. $在Users.Favorites中查找是否存在Apartments._id
  2. 使用数组计数通过$SIZE得到的结果替换FavoritesCount

Playground

Mongodb相关问答推荐

Mongo如何找到字段排除特殊字符

在MongoDB中使用explain()和查询时缺少winningPlan''''

映射数组值并查找每个匹配的集合

如何在MongoDB中查找和过滤嵌套数组

我可以在BSON中使用代理字段吗?

MongoDB - 来自先前匹配文档的聚合匹配字段

如何在 mongodb 查找的外键中使用正则表达式

根据条件删除一些数组元素并将数组的大小更新为mongo中的另一个文件

使用名为 Object 键的 uuid 创建 mongodb 文档

无法让 Mongoose.js 子文档数组填充

findOneAndUpdate 和 findOneAndReplace 有什么区别?

使用 AngularJs 和 MongoDB/Mongoose

Mongo查找对象内最长数组的查询

在 MongoDb 中查询小于 NOW 的日期时间值

如何更新 mongodb 文档以向数组添加新元素?

将 mongoose 字符串模式类型默认值设为空白并使该字段可选

在 URL 中使用 ID(来自 mongo 的 ObjectId)是否安全?

适用于 Windows 10 64 位的 MongoDB 下载

Mongodb 设计,嵌入与关系

Mongoid 不在查询中