我有一个名为“资源”的集合,其中包含文档:
{
"_id" : "fGR4ECcw5p2HFgxd3",
"ownerId" : "J8MpsWChPQdET6jwQ",
"inventory" : [
{
"_id" : ObjectId("5b537ef5895adfeae037e0a4"),
"quantity" : 17
},
{
"_id" : ObjectId("5b537d9c895adfeae037dbd2"),
"quantity" : 6
},
{
"_id" : ObjectId("5b5868e081702f675304290e"),
"quantity" : 26
},
{
"_id" : ObjectId("5b5eba8276dd90bd75e27f13"),
"quantity" : 85
},
{
"_id" : ObjectId("5b5ee58176dd90bd75e2f35f"),
"quantity" : 5
},
{
"_id" : ObjectId("5b62275686f92e050a9d50b2"),
"quantity" : 3
}
]
}
我想做的是获取具有该对象ID的库存阵列对象
我觉得这应该可行,但不可行
Resources.findOne({ownerId:userid,"inventory._id":ObjectId})
例如,我的预期输出:
{
"_id" : ObjectId("5b537ef5895adfeae037e0a4"),
"quantity" : 17
}
我也尝试过:
console.log(Resources.findOne({ownerId:userid},{fields:{inventory:{$elemMatch:{_id:ids[i]}}}}));
答案 0 :(得分:1)
您可以根据文档使用MongoDB aggregations:
聚合操作处理数据记录并返回计算结果。聚合操作将来自多个文档的值分组在一起,并且可以对分组的数据执行各种操作以返回单个结果。
请确保流星具有proper interface to MongoDB aggregations,即Resources.aggregate
以后的mongo shell查询在我的机器上可以使用您提到的文档。
db.test.aggregate([
{
$match: {
ownerId: "J8MpsWChPQdET6jwQ",
inventory: {
$elemMatch: {
"_id": ObjectId("5b537ef5895adfeae037e0a4")
}
}
}
},
{
$project: {
_id: 0,
inventory: 1
}
},
{
$project: {
result:
{
$arrayElemAt: [
{
$filter: {
input: "$inventory",
as: "product",
cond: {
$eq: [
"$$product._id",
ObjectId("5b537ef5895adfeae037e0a4")
]
}
}
},
0
]
}
}
}
])
结果是:
{
"result" : {
"_id" : ObjectId("5b537ef5895adfeae037e0a4"),
"quantity" : 17
}
}
答案 1 :(得分:1)
假设您只想访问该数据,这是一种更简单的方法。
您可以获取资源,然后遍历资源清单并找到所需的对象。
尝试类似这样的方法(userId和objectId是您的输入/搜索变量。我也用驼峰式将它们括起来):
var userId = "some id";
var objectId = "some id";
var resource = Resources.findOne({"ownerId": userId});
var inventory = resource.inventory;
var output = {};
for(var i = 0; i < inventory.length; i++) {
if(inventory[i]._id == objectId) {
output = inventory[i];
}
}
答案 2 :(得分:1)
您可以尝试
db.collection.find({
"ownerId": "J8MpsWChPQdET6jwQ"
},
{
"inventory": {
"$elemMatch": {
"_id": ObjectId("5b537ef5895adfeae037e0a4")
}
}
})
尝试here