当前位置: 首页 > 知识库问答 >
问题:

如何通过使用Mongoose和MongoDB 2.6插入到子文档中数组中的某个位置

商宝
2023-03-14

在我的问题的答案中给出了如何使用Mongoose来使用新的$位置运算符的很好的解释。建议的解决方案非常适合简单的数组。如果数组在子文档中或数组的每个元素都是数组,则建议的解决方案不起作用。我的意思是这样的:

List.collection.update(
{/*....*/},
{ "$push": {
    "subdocument.list": {
      "$each": [ 1, 2, 3 ],
      "$position": 0 }
    }
},function(err,NumAffected) {
  console.log("done");

});
List.collection.update(
{/*....*/},
{ "$push": {
    "list1.$.list2": {
      "$each": [ 1, 2, 3 ],
      "$position": 0 }
    }
},function(err,NumAffected) {
  console.log("done");

});

共有3个答案

微生运浩
2023-03-14

我在MongooseJS模型中找到了代码。省略对$位置修饰符的支持的更新。

在版本3.8.8中,查询的第1928-1941行。js公司:

      if ('$each' in val) {
        obj[key] = {
            $each: this._castUpdateVal(schema, val.$each, op)
        }

        if (val.$slice) {
          obj[key].$slice = val.$slice | 0;
        }

        if (val.$sort) {
          obj[key].$sort = val.$sort;
        }

      }

在此,obj[键]将设置为val.$。您可以看到对设置$slice的明确支持

因此,尽管您可以绕过MongooseJS的Model.update函数直接访问MongoDB的更新函数,但很明显MongooseJS的Model.update函数不支持$位置修饰符。

常经赋
2023-03-14

不确定问题出在哪里:

db.list.insert({ "list": { "sub": [4] } })
db.list.update(
    {},
    { "$push": { "list.sub": { "$each": [1,2,3], "$position": 0 } } }
)

{ "list" : { "sub" : [ 1, 2, 3, 4 ] } }

所以这一切都如期而至。

另一个例子是:

db.list.insert({
    outer: [
       {
           key: "a", 
           inner: [4]
       },
       {
           key: "b", 
           inner: [4]
       }
   ]
})

db.list.update(
    { "outer.key": "b" },
    { "$push": { 
        "outer.$.inner": { 
            "$each": [1,2,3], "$position": 0 
        }
    }}
)

再次是预期的:

{
    "outer" : [
            {
                    "key" : "a",
                    "inner" : [
                            4
                    ]
            },
            {
                    "key" : "b",
                    "inner" : [
                            1,
                            2,
                            3,
                            4
                    ]
            }
    ]
}

已经解释了与特定驱动因素的交互作用,因此数据中一定有不同之处,但如果有,则这些陈述无效。

所以使用猫鼬也是一样的:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

mongoose.connect('mongodb://localhost/nodetest');

var listSchema = new Schema({

});

var List = mongoose.model( "List", listSchema );
var Other = mongoose.model( "Other", listSchema );

  List.collection.update(
    {},
    { "$push": {
    "list.sub": {
      "$each": [ 1, 2, 3 ],
      "$position": 0 }
    }
    },function(err,NumAffected) {
      console.log("done");

    }
  );


  Other.collection.update(
    { "outer.key": "b" },
    { "$push": {
        "outer.$.inner": {
            "$each": [ 1, 2, 3 ],
            "$position": 0
        }
    }},function(err,NumAffected) {
      console.log("done2")
    }
  );
程成天
2023-03-14

在当前的Mongoose版本(4.4.2)中,您可以像这样使用位置

Foo.update(query.id,
    {
        $push: {
            arrayData: {
                $each: [{                       
                    date: new Date
                }], $position: 0 
            }
        }
    });
 类似资料:
  • b)“Units”字段包含带有“period”字段的子文档(日期对象数组),其中给定的日期位于数组中的第一和第二元素之间。 数据结构如下所示: 我尝试使用.find()和.aggregate()的各种组合,例如在periol数组上使用$project和$filter,在unit._id上使用$elemmatch之后使用$elemmatch,但是没有用--我得到了诸如“不能在数组上使用$filter

  • 我有一份这样的文件 上面的文档可以这样概括如下,便于理解。 我需要增加nums子文档中数量的值,该值位于产品子文档中,基于其\u id。 这是我迄今为止所尝试的,但它不起作用,因为我不知道如何捕获nums对象内的\u id,以便更新子子文档数组中的特定对象。 我怎样才能做到这一点?

  • 问题内容: 我在子文档中有这样的数组 我可以过滤> 3的子文档吗 我的预期结果如下 我尝试使用,$elemMatch但返回数组中的第一个匹配元素 我的查询: 结果返回数组中的一个元素 我尝试使用聚合与$match但不起作用 返回数组中的所有元素 我可以过滤数组中的元素以获得预期结果吗? 问题答案: 使用是正确的方法,但在应用数组之前需要先对数组进行过滤,以便可以过滤单个元素,然后用于将其放回原处:

  • 我有一份这样的文件: 我想通过将其与数量字段(2*800)相乘来更新价格字段,其中的结果将更新/分配给价格。(对于本例,价格更新为1600)。 更新后的文档: 我的选择查询如下: 我怎样才能做到这一点?

  • 现在我想做的是将一个GeoStamps列表推送到Mongo中的GeoStamp数组,在那里我首先过滤跟踪器的ObjectId或它的iCAN。然后在文档中发现我需要按日过滤,所以我不会将GeoStamp列表添加到分布在多个日期的多个GeoStamp数组中。 我想可以用下面的方法来做: 我的查询(是的,我知道retrievedFields是不推荐的,我不想使用它,但这是我最接近工作的解决方案): 写入

  • 我的简化模式如下所示: 我想找到所有叫艾伦的人。我看了这个非常相似的问题,但它发现的是团队,而不是人。我想这里也是。即使我没有persons集合,是否有返回persons的查询? 我想我可以使用引用的技术找到团队,然后撤出他们的人员。我猜是这样的: 但是还有更直接的方法,对吗?