我在mongodb中有一个简单的数据结构:
{
_id: ObjectID,
name: 'Name',
birthday: '25.05.2001'
items: [
{
_id: ObjectID,
name: 'ItemName',
info: 'ItemInfo',
},
{
_id: ObjectID,
name: 'ItemName',
info: 'ItemInfo',
}
]
}
现在我想要一个查询,它将一个项目的ObjectID(_id)作为条件,并让我返回包含数组中所有项目的对象并投影一个新字段" selected"将值true或false放入每个数组项结果的字段中:
我用这个查询试过了:
{ $unwind: '$items' },
{
$project: {
selected: {
$cond: { if: { 'items._id': itemObjectID }, then: true, else: false },
},
},
},
但是MongoDB给了我一个错误:
MongoError: FieldPath field names may not contain '.'.
不知道为什么它不起作用,没有任何帮助或想法?非常感谢你!
答案 0 :(得分:1)
这里缺少的是$eq聚合运算符,它检查条件是否相等。
如果您想检查ObjectId
,则可以在此处尝试以下聚合,然后您需要mongoose.Types.ObjectId(_id)
db.collection.aggregate([
{ "$unwind": "$items" },
{ "$addFields": {
"items.selected": {
"$eq": [
1111,
"$items._id"
]
}
}},
{ "$group": {
"_id": "$_id",
"name": { "$first": "$name" },
"items": {
"$push": {
"_id": "$items._id",
"selected": "$items.selected"
}
}
}}
])
将提供以下输出
[
{
"_id": ObjectId("5a934e000102030405000000"),
"items": [
{
"_id": 1111,
"selected": true
},
{
"_id": 2222,
"selected": false
}
],
"name": "Name"
}
]
您可以查看here
答案 1 :(得分:0)
@Ashish:非常感谢你的帮助!您的回答帮助我为我构建了正确的查询:
db.collection.aggregate([
{
$unwind: "$items"
},
{
$project: {
"items.name": 0,
"birthday": 0
}
},
{
"$addFields": {
"items.selected": {
"$eq": [
1111,
"$items._id"
]
}
}
},
{
$group: {
_id: "$_id",
"name": {
"$first": "$name"
},
items: {
$push: "$items"
}
}
},
{
$match: {
"items._id": {
$eq: 1111
}
}
},
])
并导致结果如下:
[
{
"_id": ObjectId("5a934e000102030405000000"),
"items": [
{
"_id": 1111,
"selected": true
},
{
"_id": 2222,
"selected": false
}
],
"name": "Name"
}
]