我有疑问,在数据库中我有模型:
board.model.js
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var BoardSchema = new Schema({
name: { type: String, maxlength: 20 },
lists : { type: Array },
users : [{ type : Schema.Types.ObjectId, ref: 'User' }],
});
module.exports = mongoose.model('Board', BoardSchema);
在列表内添加阵列卡。 在实践中它看起来像这样:
{
"_id" : ObjectId("59df60fb6fad6224f4f9f22a"),
"name" : "1",
"users" : [
ObjectId("59cd114cea98d9326ca1c421")
],
"lists" : [
{
"list" : "1",
"cards" : [
{
"name" : "1",
"Author" : [
ObjectId("59df60fb6fad6224f4f9f22a")
],
},
{
"name" : "2"
},
{
"name" : "3"
}
]
},
{
"list" : "2",
"cards" : [
{
"name" : "1",
"Author" : [
ObjectId("59df60fb6fad6224f4f9f22a")
],
},
{
"name" : "2",
"Author" : [
ObjectId("59df60fb6fad6224f4f9f22a")
],
},
{
"name" : "3"
}
]
}
],
"__v" : 0
}
好的,这是一个板子的例子,问题是我可以只拉出作者是“作者”的牌:所有板子的ObjectId(“59df60fb6fad6224f4f9f22a”)?
答案 0 :(得分:0)
您可以在3.4中尝试以下聚合。
在每个棋盘中跟随所有匹配的($filter
)卡片,然后按$unwind
并推送以收集所有卡片。
故障:
$reduce
将单个文档中的所有卡阵列连接起来。
$filter
使用$$this
(cards
数组)参数和过滤器来匹配卡片,$$value
保留以前的值。
$concatArrays
将先前的值与当前过滤的值合并。
$unwind
解析卡阵列,$group
解析$push
以获取所有卡片阵列。
db.collection.aggregate([
{
"$project": {
"boardcards": {
"$reduce": {
"input": "$lists.cards",
"initialValue": [],
"in": {
"$concatArrays": [
"$$value",
{
"$filter": {
"input": "$$this",
"as": "result",
"cond": {
"$eq": [
"$$result.Author",
ObjectId("59df60fb6fad6224f4f9f22a")
]
}
}
}
]
}
}
}
}
},
{
"$unwind": "$boardcards"
},
{
"$group": {
"_id": null,
"allboardcards": {
"$push": "$boardcards"
}
}
}
])
根据评论中的要求,只需获取卡片的名称,您必须将$filter
运算符中的$map
包裹到地图卡名称中。
所以用$filter
+ $map
$filter
{
"$map": {
"input": {
"$filter": {
"input": "$$this",
"as": "result",
"cond": {
"$eq": [
"$$result.Author",
ObjectId("59df60fb6fad6224f4f9f22a")
]
}
}
},
"as": "result",
"in": {
"name": "$$result.name"
}
}
}