📜  $unwind mongodb (1)

📅  最后修改于: 2023-12-03 15:29:06.071000             🧑  作者: Mango

MongoDB中$unwind的介绍

在MongoDB中,$unwind操作符可以被用于将数组类型的字段展开并将每个元素作为单独的文档进行处理。这个操作符通常用于解决需要在查询数组类型字段中的值进行聚合计算的场景。

语法

$unwind操作符的语法如下:

{$unwind: <field>}

其中,<field>指的是需要展开的数组类型字段。例如,如果我们有一个包含了数组类型字段的集合,每个文档类似下面这样:

{
    "_id": ObjectId("5f02e72d652757fb98853eeb"),
    "name": "Alice",
    "hobbies": ["reading", "swimming", "coding"]
}

我们可以使用$unwind操作符将hobbies字段展开,得到以下文档序列:

{
    "_id": ObjectId("5f02e72d652757fb98853eeb"),
    "name": "Alice",
    "hobbies": "reading"
},
{
    "_id": ObjectId("5f02e72d652757fb98853eeb"),
    "name": "Alice",
    "hobbies": "swimming"
},
{
    "_id": ObjectId("5f02e72d652757fb98853eeb"),
    "name": "Alice",
    "hobbies": "coding"
}
注意事项
  • 如果需要展开多个数组类型字段,需要使用多个$unwind操作符。
  • 如果展开的字段不存在或不是数组类型,$unwind操作符将会报错。
  • $unwind操作符不能用于分片集合的查询,要使用$lookup操作符代替。
例子

假设我们有一个包含了人员信息和他们的书籍清单的文档集合,类似这样:

{
    "_id": ObjectId("5f02e72d652757fb98853eeb"),
    "name": "Alice",
    "books": [
        { "title": "The Great Gatsby", "author": "F. Scott Fitzgerald" },
        { "title": "To Kill a Mockingbird", "author": "Harper Lee" },
        { "title": "1984", "author": "George Orwell" }
    ]
},
{
    "_id": ObjectId("5f02e72d652757fb98853eec"),
    "name": "Bob",
    "books": [
        { "title": "The Catcher in the Rye", "author": "J.D. Salinger" },
        { "title": "The Hobbit", "author": "J.R.R. Tolkien" }
    ]
}

我们现在想要统计每个作者的书籍总数,可以使用以下代码:

db.books.aggregate([
    {$unwind: "$books"},
    {$group: {_id: "$books.author", count: {$sum: 1}}}
])

这段代码使用$unwind将books字段展开,然后使用$group操作符计算每个作者的书籍总数。

总结

$unwind操作符是MongoDB中一个很有用的操作符,可以帮助我们对数组类型字段进行聚合计算。需要注意的是,$unwind操作符只能用于查询,不能用于分片集合。