首页 \ 问答 \ 如何查询和删除MongoDB中数组字段中的嵌入对象?(How to query for and delete embedded objects in an array field in MongoDB?)

如何查询和删除MongoDB中数组字段中的嵌入对象?(How to query for and delete embedded objects in an array field in MongoDB?)

我正在尝试运行一个更新命令,在所有文档的数组字段中找到一个对象,然后从该数组字段中为所有文档提取它。 我尝试了以下命令,它们不返回任何文档(nMatched:0)。

db.users.update({"likedQuizzes.quiz": { $elemMatch: quizObj}},{$pull: {"likedQuizzes.quiz": quizObj }});
db.users.update({"likedQuizzes": { $elemMatch: quizObj}},{$pull: {"likedQuizzes": quizObj }});

在上面的例子中, quizObj = {"title" : "2 Purple", "author" : "purple-tester1"}

以下是“用户”集合中的示例文档:

{

"_id" : ObjectId("581114330de9ac0c1445cdd6"),
"user" : "test-username1",  
"likedQuizzes" : [
        {
            "quiz" : {
                "title" : "2 Purple",
                "author" : "purple-tester1"
            },
            "date" : ISODate("2016-10-26T20:39:02.695Z")
        },
        {
            "quiz" : {
                "title" : "1 Purple",
                "author" : "purple-tester1"
            },
            "date" : ISODate("2016-10-26T20:39:12.374Z")
        },
        {
            "quiz" : {
                "title" : "4 Green",
                "author" : "green-tester1"
            },
            "date" : ISODate("2016-10-26T20:39:25.304Z")
        },
        {
            "quiz" : {
                "title" : "3 Green",
                "author" : "green-tester1"
            },
            "date" : ISODate("2016-10-26T20:39:37.326Z")
        },
        {
            "quiz" : {
                "title" : "2 Green",
                "author" : "green-tester1"
            },
            "date" : ISODate("2016-10-26T20:40:12.964Z")
        }
    ]
}

换句话说,我只是试图找出一个测验是否在用户的“likesQuizzes”数组中,如果是,则从该数组中删除它(以及它所喜欢的“日期”)。

经过一些研究后,看起来这可能是不可能的,但我还是想问,因为我认为我的模式可能与我研究中提出的例子不同。 提前感谢任何指针。


I am trying to run an update command that finds an object in an array field for all documents and then pulls it from that array field for all documents. I have tried the below commands, which do not return any documents (nMatched: 0).

db.users.update({"likedQuizzes.quiz": { $elemMatch: quizObj}},{$pull: {"likedQuizzes.quiz": quizObj }});
db.users.update({"likedQuizzes": { $elemMatch: quizObj}},{$pull: {"likedQuizzes": quizObj }});

In the above cases quizObj = {"title" : "2 Purple", "author" : "purple-tester1"}

Here is a sample document from the 'users' collection:

{

"_id" : ObjectId("581114330de9ac0c1445cdd6"),
"user" : "test-username1",  
"likedQuizzes" : [
        {
            "quiz" : {
                "title" : "2 Purple",
                "author" : "purple-tester1"
            },
            "date" : ISODate("2016-10-26T20:39:02.695Z")
        },
        {
            "quiz" : {
                "title" : "1 Purple",
                "author" : "purple-tester1"
            },
            "date" : ISODate("2016-10-26T20:39:12.374Z")
        },
        {
            "quiz" : {
                "title" : "4 Green",
                "author" : "green-tester1"
            },
            "date" : ISODate("2016-10-26T20:39:25.304Z")
        },
        {
            "quiz" : {
                "title" : "3 Green",
                "author" : "green-tester1"
            },
            "date" : ISODate("2016-10-26T20:39:37.326Z")
        },
        {
            "quiz" : {
                "title" : "2 Green",
                "author" : "green-tester1"
            },
            "date" : ISODate("2016-10-26T20:40:12.964Z")
        }
    ]
}

Said another way, I am simply trying to find if a quiz is in a users' "likedQuizzes" array, and if it is, delete it from that array (along with the "date" that it was liked).

After some researching it looks like this might not be possible, but I wanted to ask anyway because I think my schema might be different enough from the examples that came up in my research. Thanks in advance for any pointers.


原文:https://stackoverflow.com/questions/40597119
更新时间:2021-10-02 07:10

最满意答案

  1. 使标记全局化。
  2. 在创建新的之前检查它是否存在。
  3. 如果存在则使用.setPosition将其移动到新位置
  4. 如果它不存在,请在所需位置创建标记。

做一些接近你想要的事情的例子

工作代码片段:

var map = null;
var marker = null;
var geocoder = new google.maps.Geocoder();
var infowindow = new google.maps.InfoWindow({pixelOffset: new google.maps.Size(0,-34)});

function initialize() {
  map = new google.maps.Map(document.getElementById('map-canvas'), {
    center: new google.maps.LatLng(42, -85),
    zoom: 4
  });
}

function codeAddress() {
  var address = document.getElementById('address').value;
  geocoder.geocode({
    'address': address
  }, function(results, status) {
    if (status == google.maps.GeocoderStatus.OK) {
      map.setCenter(results[0].geometry.location);
      content = results[0].formatted_address;
      infowindow.setContent(content);
      if (marker && marker.setPosition) {
        marker.setPosition(results[0].geometry.location);
      } else {
        marker = new google.maps.Marker({
          map: map,
          icon: {
            url: 'http://maps.google.com/mapfiles/arrow.png',
            anchor: new google.maps.Point(10, 34)
          },
          position: results[0].geometry.location
        });
        google.maps.event.addListener(marker, 'click', function(evt) {
          infowindow.open(map);
        });
      }
      infowindow.setPosition(results[0].geometry.location);
      infowindow.open(map);
    } else {
      alert('Your search was not successful for the following reason: ' + status);
    }
  });
}
google.maps.event.addDomListener(window, 'load', initialize);
html,
body,
#map-canvas {
  height: 500px;
  width: 500px;
  margin: 0px;
  padding: 0px
}
<script src="https://maps.googleapis.com/maps/api/js?v=3"></script>
<input id="address" value="New York, NY" />
<input id="geocode" type="button" value="Find" onclick="codeAddress()" />
<div id="map-canvas"></div>


  1. Make the marker global.
  2. Check if it exists before creating a new one.
  3. if it exists use .setPosition to move it to the new location
  4. if it doesn't exist, create a marker at the desired location.

Example that does something close to what you want

working code snippet:

var map = null;
var marker = null;
var geocoder = new google.maps.Geocoder();
var infowindow = new google.maps.InfoWindow({pixelOffset: new google.maps.Size(0,-34)});

function initialize() {
  map = new google.maps.Map(document.getElementById('map-canvas'), {
    center: new google.maps.LatLng(42, -85),
    zoom: 4
  });
}

function codeAddress() {
  var address = document.getElementById('address').value;
  geocoder.geocode({
    'address': address
  }, function(results, status) {
    if (status == google.maps.GeocoderStatus.OK) {
      map.setCenter(results[0].geometry.location);
      content = results[0].formatted_address;
      infowindow.setContent(content);
      if (marker && marker.setPosition) {
        marker.setPosition(results[0].geometry.location);
      } else {
        marker = new google.maps.Marker({
          map: map,
          icon: {
            url: 'http://maps.google.com/mapfiles/arrow.png',
            anchor: new google.maps.Point(10, 34)
          },
          position: results[0].geometry.location
        });
        google.maps.event.addListener(marker, 'click', function(evt) {
          infowindow.open(map);
        });
      }
      infowindow.setPosition(results[0].geometry.location);
      infowindow.open(map);
    } else {
      alert('Your search was not successful for the following reason: ' + status);
    }
  });
}
google.maps.event.addDomListener(window, 'load', initialize);
html,
body,
#map-canvas {
  height: 500px;
  width: 500px;
  margin: 0px;
  padding: 0px
}
<script src="https://maps.googleapis.com/maps/api/js?v=3"></script>
<input id="address" value="New York, NY" />
<input id="geocode" type="button" value="Find" onclick="codeAddress()" />
<div id="map-canvas"></div>

相关问答

更多

相关文章

更多

最新问答

更多
  • 如何使用自由职业者帐户登录我的php网站?(How can I login into my php website using freelancer account? [closed])
  • 如何打破按钮上的生命周期循环(How to break do-while loop on button)
  • C#使用EF访问MVC上的部分类的自定义属性(C# access custom attributes of a partial class on MVC with EF)
  • 如何获得facebook app的publish_stream权限?(How to get publish_stream permissions for facebook app?)
  • 如何并排放置两个元件?(How to position two elements side by side?)
  • 在MySQL和/或多列中使用多个表用于Rails应用程序(Using multiple tables in MySQL and/or multiple columns for a Rails application)
  • 如何隐藏谷歌地图上的登录按钮?(How to hide the Sign in button from Google maps?)
  • Mysql左连接旋转90°表(Mysql Left join rotate 90° table)
  • 带有ImageMagick和许多图像的GIF动画(GIF animation with ImageMagick and many images)
  • 电脑高中毕业学习去哪里培训
  • 电脑系统专业就业状况如何啊?
  • IEnumerable linq表达式(IEnumerable linq expressions)
  • 如何在Spring测试中连接依赖关系(How to wire dependencies in Spring tests)
  • Solr可以在没有Lucene的情况下运行吗?(Can Solr run without Lucene?)
  • 如何保证Task在当前线程上同步运行?(How to guarantee that a Task runs synchronously on the current thread?)
  • 在保持每列的类的同时向数据框添加行(Adding row to data frame while maintaining the class of each column)
  • 的?(The ? marks in emacs/haskell and ghc mode)
  • 一个线程可以调用SuspendThread传递自己的线程ID吗?(Can a thread call SuspendThread passing its own thread ID?)
  • 延迟socket.io响应,并“警告 - websocket连接无效”(Delayed socket.io response, and “warn - websocket connection invalid”)
  • 悬停时的图像转换(Image transition on hover)
  • IIS 7.5仅显示homecontroller(IIS 7.5 only shows homecontroller)
  • 没有JavaScript的复选框“关闭”值(Checkbox 'off' value without JavaScript)
  • java分布式框架有哪些
  • Python:填写表单并点击按钮确认[关闭](Python: fill out a form and confirm with a button click [closed])
  • PHP将文件链接到根文件目录(PHP Linking Files to Root File Directory)
  • 我如何删除ListView中的项目?(How I can remove a item in my ListView?)
  • 您是否必须为TFS(云)中的每个BUG创建一个TASK以跟踪时间?(Do you have to create a TASK for every BUG in TFS (Cloud) to track time?)
  • typoscript TMENU ATagParams小写(typoscript TMENU ATagParams lowercase)
  • 武陟会计培训类的学校哪个好点?
  • 从链接中删除文本修饰(Remove text decoration from links)